我试图在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' )
答案 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)
创建一个包含所有可能的年/月/日期的表(取决于您的需要)。 然后离开加入桌子。