У меня есть два отдельных запроса, которые я использую, чтобы получить информацию для отчета. Один год работал нормально. Однако, если месяц имеет более 1 года, он не показывает правильные ответы.
Вот мои два запроса:
select SUM(rpt_complete.total) total, YEAR(bk_schedule.date) as year,zip_codes.zip_code
from rpt_complete
left join bk_schedule on rpt_complete.bk_id = bk_schedule.id
left join users_info on bk_schedule.users_info_id = users_info.id
left join zip_codes on users_info.zip_code = zip_codes.zip_code
group by zip_codes.zip_code, YEAR(bk_schedule.date)select SUM(rpt_complete.total) total, MONTH(bk_schedule.date) as month, zip_codes.zip_code
from rpt_complete
left join bk_schedule on rpt_complete.bk_id = bk_schedule.id
left join users_info on bk_schedule.users_info_id = users_info.id
left join zip_codes on users_info.zip_code = zip_codes.zip_code
group by zip_codes.zip_code, MONTH(bk_schedule.date)
Затем я перебираю результаты месяца как таковые (и включаю год в цикл):
@foreach($month_total as $month)
<tr>
<td>{{ $month->zip_code }}</td>
<td>{{ $month->month }}</td>
<td>${{ $month->total }}</td>
<td>
@foreach($year_total as $year)
@if($month->zip_code == $year->zip_code)
{{ $year->year }}
@endif
@endforeach
</td>
<td>
@foreach($year_total as $year)
@if($month->zip_code == $year->zip_code)
${{ $year->total }}
@endif
@endforeach
</td>
</tr>
@endforeach
Так что, если у меня есть итог на декабрь 2014 & Декабрь 2015 и моя таблица фильтруется на декабрь 2014 … декабрь 2014 & 2015 год покажет в этих результатах.
Я думаю, мне трудно понять, как обрабатывать месяц и год, где они суммируют данные.
РЕДАКТИРОВАТЬ: Это MySQL. В частности, я использую Laravel для вывода моего SQL.
Вот мой стол: http://i.imgur.com/RClRDaW.png
Как вы можете видеть, 36066 имеет две записи из-за того, что они находятся в двух разных месяцах: Однако они также находятся в двух разных годах. Часть года — это то, что сбрасывает мой стол. Вы можете видеть, что он вычисляет все это вместе, а не просто по месяцам и суммирует год для этой записи месяцев.
Мои ожидаемые результаты для 36066 1 месяц (январь) показывают только 2017 год с этой общей суммой, а 36066 10 месяцев (октябрь) показывают только 2016 год с этими годами, поскольку эти годы принадлежат этим двум месяцам.
Итак, мне нужно, чтобы результаты выглядели так: http://i.imgur.com/jlFhR7x.png
Я надеюсь, что это дает такую ясность.
добавлять YEAR(bk_schedule.date)
в GROUP BY
вашего второго запроса
group by zip_codes.zip_code, MONTH(bk_schedule.date), YEAR(bk_schedule.date)
если вы получили ошибку, просто включите
YEAR(bk_schedule.date)
в выбранные вами поля
Попробуй это:
SELECT
zip_codes.zip_code,
substr(bk_schedule.`date`, 1,7) AS ym,
SUM(rpt_complete.total) AS total
FROM ...
LEFT JOIN ...
GROUP BY 1,2
Обновлено:
Если вы хотите, чтобы и год, и год-месяц отображались в одной строке, лучше использовать скрипт для зацикливания, ИЛИ использовать результаты из 2 SQL и отображать вместе. В противном случае попробуйте следующий пример (который не рекомендуется):
SELECT y.geo, ym.ym, y.hit year_hit, ym.hit month_hit
FROM (
SELECT geo,year(ymd) y,sum(hit) hit FROM log_ip_hit
WHERE geo in ('US','CN')
AND ymd BETWEEN '2015-07-01' AND '2016-03-31'
GROUP BY 1,2
) AS y
JOIN (
SELECT geo,substr(ymd,1,7) ym,sum(hit) hit FROM log_ip_hit
WHERE geo in ('US','CN','AU')
AND ymd BETWEEN '2015-07-01' AND '2016-03-31'
GROUP BY 1,2
) AS ym ON y.geo = ym.geo AND y.y = substr(ym.ym,1,4)
Прочитав ваш обновленный вопрос, я думаю, что следующее решение является лучшим:
SELECT
zip_codes.zip_code,
year(bk_schedule.`date`) AS y,
substr(bk_schedule.`date`, 5,2) AS m,
SUM(rpt_complete.total) AS total
FROM ...
LEFT JOIN ...
GROUP BY 1,2,3
И когда вы отображаете результат, используйте цикл и сумму на основе год + почтовый индекс.