我写了一个sql查询来获取特定月份的所有记录
select month(loggingdate),Count(id) from communicationlogs
where clientid=20154 and month(loggingdate) in (1,2,3,4,5,6,7,8,9)
group by month(loggingdate)
7 65
8 5
这里的记录出现在第7个月和第8个月。我想获得其他月份数字的0值,如 -
1 0
2 0
3 0
4 0
...
答案 0 :(得分:1)
这是一个标准问题,日历表就派上用场了。顾名思义,日历表是一个只存储一系列日期的表。在您的特定情况下,我们只需要对应于12个月的数字。使用日历表开始查询,然后将其作为子查询连接到聚合查询。
请注意以下COALESCE
的使用。如果您的原始查询中没有显示给定月份,则其计数将在联接中显示为NULL
,在这种情况下,我们会在该月报告为零。
WITH calendar_month AS (
SELECT 1 AS month
UNION ALL
SELECT month +1
FROM
calendar_month
WHERE month +1 <= 12
)
SELECT
t1.month,
COALESCE(t2.cnt, 0) AS cnt
FROM calendar_month t1
LEFT JOIN
(
SELECT
MONTH(loggingdate) as month,
COUNT(id) AS cnt
FROM communicationlogs
WHERE
clientid = 20154 AND
MONTH(loggingdate) IN (1,2,3,4,5,6,7,8,9)
GROUP BY MONTH(loggingdate)
) t2
ON t1.month = t2.month