SQL - 使用group by显示没有数据的月份

时间:2017-03-20 18:01:53

标签: php mysql sql

我一直在搜索没有成功的方法,以便在报告中的两个日期之间以格式YEAR-MONTH列出所有月份的数据。

我的此查询运行良好,但没有显示数据不存在的月份。

SELECT  DATE_FORMAT(FROM_UNIXTIME(bt.date_submitted),'%Y-%m') AS month, count(*) as the_count
        FROM bug_table bt
        WHERE bt.category_id=2 
        AND  bt.date_submitted BETWEEN " . db_prepare_string( $db_datetimes['start'] ) . "
        AND " . db_prepare_string( $db_datetimes['finish'] ) . "
        GROUP BY month
        ORDER BY month ASC

date_submitted是一个UNIX_TIMESTAMP,$db_datetimes是php上的一个关联数组,用于存储用户选择的日期。

例如,我想要2016-10-01和2017-03-20之间的所有月份的列表。我得到了:

 month   | the_count
 2017-03       7
 2017-02       5
 2017-01       2
 2016-12      10

但我想如下,包括有任何记录的月份零:

 month   | the_count
 2017-03       7
 2017-02       5
 2017-01       2
 2016-12      10
 2016-11       0
 2016-10       0

真诚地我更喜欢在SQL上解决这个问题,但欢迎使用SQL或php的任何想法!

3 个答案:

答案 0 :(得分:0)

您可以创建一个包含所有月份的表格,并从该表格到主表格进行左连接。然后用0替换NULL。

答案 1 :(得分:0)

您是否尝试过加入日期 FROM table1 LEFT OUTER JOIN date ON table1.date = table2.date

答案 2 :(得分:0)

您可以采用以下方法之一:

  • 动态(使用查询)创建month-year值列表,并将该查询的LEFT JOIN结果创建为您正在使用的值。 SO答案的示例是here
  • 创建calenar表并使用dates填充该表。然后,您可以将LEFT JOINcalendar一起使用并获取值。
  • 在应用程序的服务/业务层处理此逻辑(即,创建月份数组,并根据从db检索的结果在用户界面上显示值)。

我建议使用第三种方法,因为它是最干净的方法,不会增加数据库或服务层的复杂性。