如果特定月份没有记录,我想获取数据

时间:2017-09-06 11:33:46

标签: sql-server sql-server-2008 sql-server-2005

我写了一个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
...

1 个答案:

答案 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