Отображение суммы SUM за месяц и года в одном запросе

У меня есть два отдельных запроса, которые я использую, чтобы получить информацию для отчета. Один год работал нормально. Однако, если месяц имеет более 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

Я надеюсь, что это дает такую ​​ясность.

1

Решение

добавлять YEAR(bk_schedule.date) в GROUP BY вашего второго запроса

group by zip_codes.zip_code, MONTH(bk_schedule.date), YEAR(bk_schedule.date)

если вы получили ошибку, просто включите

YEAR(bk_schedule.date)

в выбранные вами поля

0

Другие решения

Попробуй это:

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

И когда вы отображаете результат, используйте цикл и сумму на основе год + почтовый индекс.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector