0

我正在尝试在 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' ) 
4

2 回答 2

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。

然后,在 select @nYear := @nYear +1 first time 中,第一年将变为 2009 年并完成 5 年,从而生成 2009 年、2010 年、2011 年、2012 年和 2013 年的记录(通过 LIMIT 5)

现在(所有年份的)结果被左连接到普通年份的 report_case_ext 表中。所以,即使是那些没有日期的

于 2013-02-02T02:13:15.237 回答
0

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

在 sql 结果中填充空日期的最直接方法是什么(在 mysql 或 perl 端)?

于 2013-02-02T01:52:40.260 回答