GROUP BY每年失踪多年

时间:2013-02-02 01:47:15

标签: mysql

我试图在MySQL中使用以下查询来汇总记录。只要每年至少有一条记录,它就能很好地运作。如果多年内缺少记录,那么年份就不会出现。如何修改此项以在我的过滤器中显示每年?

SELECT SUM( SICK_SIZE + DEAD_SIZE ) AS Cases, DATE_FORMAT( EVENT_DATE,  '%Y' ) AS DateYear
FROM report_case_ext
WHERE DATE_FORMAT( EVENT_DATE,  '%Y' ) >= DATE_FORMAT( DATE_ADD( CURDATE( ) , INTERVAL -4YEAR ) ,  '%Y' ) 
AND DATE_FORMAT( EVENT_DATE,  '%Y' ) <= DATE_FORMAT( CURDATE( ) ,  '%Y' ) 
GROUP BY DATE_FORMAT( EVENT_DATE,  '%Y' ) 

2 个答案:

答案 0 :(得分:1)

在MySQL中,您可以使用sqlvariables,连接到任何其他表来模拟行创建 - 返回您要查找的年份的有效结果集,然后LEFT-JOIN到您的其他表,这样您就知道了永远得到你想要的岁月...

select
      YearsYouWant.RequireYear as DateYear,
      SUM( RCE.SICK_SIZE + RCE.DEAD_SIZE ) AS Cases
   from
      ( select @nYear := @nYear +1 as RequireYear
           from report_case_ext,
                ( select @nYear := year( curdate()) -5 ) sqlvars
           limit 5 ) as YearsYouWant
         LEFT JOIN
            report_case_ext RCE
               on YearsYouWant.RequireYear = year( RCE.Event_Date )
   GROUP BY 
      YearsYouWant.RequireYear

使用“report_case_ext”的内部预查询仅用于拥有至少5条记录的表,以保持您想要的年份...在这种情况下,

@nYear被初始化为比你想要的4年少1年 - 因此-5

curdate()= 2013 - 5 = 2008。

然后,在选择@nYear:= @nYear +1第一次将第一年成为2009年并完成5年,从而创造2009年,2010年,2011年,2012年和2013年的记录(通过LIMIT 5)

现在,结果(所有年份)在常见年份被LEFT加入到report_case_ext表中。所以,即使是那些没有约会的人

答案 1 :(得分:0)

创建一个包含所有可能的年/月/日期的表(取决于您的需要)。 然后离开加入桌子。

What is the most straightforward way to pad empty dates in sql results (on either mysql or perl end)?