我使用两个单独的查询来提取报告的信息。一年工作正常。但是,如果一个月超过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年12月的总和&amp; 2015年12月和我的表格在2014年12月... 2014年12月过滤&amp; 2015年将在这些结果中显示。
我想我很难弄清楚如何处理将数据汇总在一起的月份和年份。
编辑:这是MySQL。具体来说,我使用Laravel输出我的SQL。这是我的表:http://i.imgur.com/RClRDaW.png
正如您所看到的,由于处于两个不同的月份,36066有两个条目:但是,它们也是在两个不同的年份。年份部分是摆脱我的桌子。您可以看到它一起计算所有内容,而不仅仅按月计算,并计算该月份条目的总和。
我的预期结果是36066 1个月(1月)仅显示2017年的总数和36066 10个月(10月)仅显示2016年的那些年份总数,因为那些是这两个月所属的年份。
所以,我需要将结果看起来像这样:http://i.imgur.com/jlFhR7x.png
我希望这提供了如此清晰。
答案 0 :(得分:0)
将YEAR(bk_schedule.date)
添加到第二个查询的GROUP BY
group by zip_codes.zip_code, MONTH(bk_schedule.date), YEAR(bk_schedule.date)
如果您收到错误,请
YEAR(bk_schedule.date)
进入您的选择字段
答案 1 :(得分: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的结果并显示togather。否则请尝试以下示例(不鼓励这样做):
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
当您显示结果时,请使用基于年份+ zip的循环和总和。