如果标题问题不是很明确,我很抱歉,但我认为我不能在一个单一的序列中解决我的问题。
我有一张表,其中包含许多不同类型的事件,并且都是根据日期记录的。
我正在查询表格并根据日期(月份和年份)的子集进行分组。
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)
由于
答案 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