在一个查询中显示月SUM和年SUM

时间:2017-01-19 03:32:38

标签: php mysql laravel

我使用两个单独的查询来提取报告的信息。一年工作正常。但是,如果一个月超过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

我希望这提供了如此清晰。

2 个答案:

答案 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)

enter image description here

在阅读更新后的问题后,我认为以下是最佳解决方案:

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的循环和总和。