【问题标题】:Count(*) grouped by month, with zero values if month has count 0 [duplicate]Count(*) 按月分组,如果月计数为 0,则值为 0 [重复]
【发布时间】:2019-08-29 21:49:46
【问题描述】:

我正在尝试从每个月的日期开始计数。

SELECT    COUNT(*) AS cnt, DATE_FORMAT(onBoardDateTime,'%Y-%m-01') AS date
FROM      paDatabase 
WHERE     YEAR(onBoardDateTime) > '2015'  
GROUP BY  MONTH(onBoardDateTime)

我还想包含 count = 0 的月份。所以结果应该是:

月 | cnt
2015-01 | 10
2015-02 | 31
2015-03 | 0
2015-04 | 5
等等。

谢谢

【问题讨论】:

  • 您好,您需要一个日历表,其中包含所有可用月份和left join,其中包含您的数据以填写缺失的月份。这可能很有趣:plumislandmedia.net/mysql/…

标签: mysql date group-by count


【解决方案1】:

试试这个:

SELECT    coalesce(COUNT(*), 0) AS cnt, DATE_FORMAT(onBoardDateTime,'%Y-%m-01') AS date
FROM      paDatabase 
WHERE     YEAR(onBoardDateTime) > '2015'  
GROUP BY  MONTH(onBoardDateTime)

(未测试)。

【讨论】:

  • 您好,感谢您的回复。我试过了,但没有任何区别。
  • 哦,值得一试:D
【解决方案2】:

您只能选择数据库中存在的数据。要获取其中没有数据的月份,请列出您感兴趣的月份并找到那些没有数据的月份。一个常见的解决方案是使用日历表,其中列出了您需要的所有月份/日期。

SELECT    COUNT(*) AS cnt, DATE_FORMAT(onBoardDateTime,'%Y-%m-01') AS date
FROM      paDatabase 
WHERE     YEAR(onBoardDateTime) > '2015'  
GROUP BY  DATE_FORMAT(onBoardDateTime,'%Y-%m-01')
UNION
SELECT    0, m
FROM CALENDAR_MONTHS
WHERE YEAR(m)>2015 AND m NOT IN (
   SELECT CAST(DATE_FORMAT(onBoardDateTime,'%Y-%m-01') as date) AS date
   FROM paDatabase 
   WHERE YEAR(onBoardDateTime) > '2015'  
);

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2019-06-06
    • 2016-10-26
    相关资源
    最近更新 更多