在聚合查询中生成一行,其中没有针对它的结果的日期

时间:2010-01-15 13:03:54

标签: sql sql-server

如果标题问题不是很明确,我很抱歉,但我认为我不能在一个单一的序列中解决我的问题。

我有一张表,其中包含许多不同类型的事件,并且都是根据日期记录的。

我正在查询表格并根据日期(月份和年份)的子集进行分组。

SELECT DATENAME(MONTH, event_date_time) + ' ' + DATENAME(YEAR, event_date_time), COUNT(reason)
FROM blacklist_history
WHERE (event_date_time BETWEEN DATEADD(mm,-6, '20/12/2009 23:59:59') AND '20/12/2009 23:59:59')
GROUP BY (DATENAME(MONTH, event_date_time) + ' ' + DATENAME(YEAR, event_date_time))
ORDER BY CONVERT(DATETIME, DATENAME(MONTH, event_date_time) + ' ' + DATENAME(YEAR, event_date_time)) ASC

(我通常有一个日期字段的变量)

此查询针对我的数据返回以下内容:

August    2009    15358
September 2009    48722
October   2009    19143
November  2009    4205
December  2009    3286

现在我要做的是让查询也返回到2009年7月,但返回0的数量。我知道SQL Server不能凭空透过魔法,但我不能在我的身上看到我将如何根据我的结果创建我想加入的数据以填补7月份的空白空间。

任何建议都会有所帮助。(使用SQL Server 2005)

由于

3 个答案:

答案 0 :(得分:1)

通常的做法是在数据库中只有一个日期表,并从中将LEFT JOIN连接到您的数据。

答案 1 :(得分:0)

您可以将您感兴趣的所有月份的列表插入到表变量中,然后从中进行OUTER连接到包含数据的表格。

答案 2 :(得分:0)

WITH    months (d) AS
        (
        SELECT  CAST('2009-01-01' AS DATETIME)
        UNION ALL
        SELECT  DATEADD(month, d, 1)
        FROM    months
        WHERE   d <= '2015-01-01'
        )
SELECT  d, COUNT(reason)
FROM    months
JOIN    blacklist_history bh
ON      event_date_time >= d
        AND event_date_time < DATEADD(month, d, 1)
GROUP BY
        d