【问题标题】: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
等等。
谢谢
【问题讨论】:
标签:
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)
(未测试)。
【解决方案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'
);