2013-03-06 221 views
0

這似乎應該很容易,但我似乎無法弄清楚。我有一張表,其中包含Artifact名稱和Modification_Date等。我有一個查詢得到的月份文件修改計數。有幾個月沒有任何修改。由於我在Modification_Date上查詢和分組,因此在沒有修改的情況下,這些月份沒有返回結果。理想情況下,在結果集中,我希望月份在那裏,0爲Quantity包括月度計數,包括不存在數據的月份

SELECT CONVERT(NVARCHAR(7), Modification_Date, 120) [Month], 
    COUNT(Artifact) as Quantity 
    FROM table 
WHERE Modification_Date > DATEADD(month, -6, getdate()) 
GROUP BY CONVERT(NVARCHAR(7), Modification_Date, 120) 
ORDER BY [Month] DESC 

這讓我類似的結果:

Month  Quantity 
-------  -------- 
2013-02  10 
2012-11  12 
2012-10  5 
2012-09  29 

正如你可以看到,2012年12月和2013年1月都沒有在結果集中。我想讓那些月份在那裏代表0 Quantity,這樣我就可以在SQL報告條形圖中使用這些數據,並使這些月份以0值表示。目前在條形圖上它完全跳過了這幾個月。有沒有辦法在過去6個月內生成yyyy-mmMonth列而不是僅僅使用Modification_Date

回答

4

不要將日期轉換爲字符串來剝離時間或日期,請使用日期算術。轉換爲字符串效率較低,還需要掃描整個表。

如果您要轉換爲固定長度的字符串,請不要使用NVARCHAR,請使用CHAR。在數字日期你需要支持哪些Unicode字符?變音?磅的標誌?象形文字?

下面是一個使用目錄視圖生成6行然後從前6個月減去當前日期組到月份的示例(和當前方法不同,應使用Modification_Date上的索引)。這在第一次看到它時並不完全直觀,但是您可以看到我的系列產品不帶環路(part 1 | part 2 | part 3)。

;WITH x(m) AS 
(
    SELECT TOP 6 DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 
    - (ROW_NUMBER() OVER (ORDER BY [object_id])), 0) 
    FROM sys.all_objects 
    ORDER BY [object_id] 
) 
SELECT [Month] = x.m, Quantity = COALESCE(COUNT(t.Artifact), 0) 
FROM x 
LEFT OUTER JOIN dbo.tablename AS t 
ON t.Modification_Date >= x.m 
AND t.Modification_Date < DATEADD(MONTH, 1, x.m) 
GROUP BY x.m 
ORDER BY x.m DESC; 

請注意,這不包括當前月份。如果你想轉移到包括日 - >月,而不是年9月 - >二月,只是改變這一行:

+ 1 - (ROW_NUMBER() OVER (ORDER BY [object_id])), 0) 

如果格式化爲YYYY-MM是絕對必要的,你可以這樣做:

;WITH y(m) AS 
(
    SELECT TOP 6 DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 
    - (ROW_NUMBER() OVER (ORDER BY [object_id])), 0) 
    FROM sys.all_objects 
    ORDER BY [object_id] 
), 
x([Month], Quantity) 
AS 
(
    SELECT [Month] = y.m, Quantity = COALESCE(COUNT(t.Artifact), 0) 
    FROM y 
    LEFT OUTER JOIN dbo.tablename AS t 
    ON t.Modification_Date >= y.m 
    AND t.Modification_Date < DATEADD(MONTH, 1, y.m) 
    GROUP BY y.m 
) 
SELECT [Month] = CONVERT(CHAR(7), [Month], 120), Quantity 
FROM x 
ORDER BY [Month] DESC; 
+0

這很好用!非常感謝。你說得對,沒有必要使用NVARCHAR。我已經看到了一個使用它的日期轉換示例,並將其用於查詢中,而不用考慮它。 – sbrown23 2013-03-06 02:33:45