2014-03-04 68 views
1

我在數據庫中的數據如下:計數幾個月沒有記錄

+---------------------+-------------+ 
|  CloseTime |  Count | 
+---------------------+-------------+ 
|  10.2.2014 13:19 | 1   | 
|  5.12.2014 13:19 | 1   | 
|  4.2.2014 13:19 | 1   | 
|  2.1.2014 13:19 | 1   | 
|  4.12.2014 13:19 | 1   | 
+---------------------+-------------+ 

現在,我有這樣的

SELECT DATENAME(MONTH, CLOSETIME) AS CLOSEMONTH, COUNT(*) as CNT 
FROM TABLE 
WHERE CLOSETIME >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE())-7, '19000101') 
AND CLOSETIME < DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101') 
GROUP BY DATENAME(MONTH, CLOSETIME); 

這導致

+---------------+-------+ 
|  CloseTime | CNT | 
+---------------+-------+ 
|  February | 2  | 
|  January | 1  | 
|  December | 2  | 
+---------------+-------+ 

的查詢查詢以最近7個月的數據獲取方式工作。我需要的結果是

+---------------+-------+ 
|  CloseTime | Count | 
+---------------+-------+ 
|  February | 2  | 
|  January | 1  | 
|  December | 2  | 
|  November | 0  | 
|  October | 0  | 
|  September | 0  | 
|  August | 0  | 
+---------------+-------+ 

因此,如果有與後幾個月關閉時間沒有記錄,它應該還是回到了一個月零計數。如何實現這一目標?我更喜歡SQL解決方案,這意味着沒有任何過程或腳本。

我試圖

SELECT DATENAME(MONTH,DATEADD(MONTH,-1,GETDATE())) as HELP_MONTH 
UNION ALL 
... 

,然後加入它,但它並沒有成功。

+0

相關http://stackoverflow.com/q uestions/7121914/sql-group-and-sum-by-month-default-to-zero?rq = 1 – 2014-03-04 12:34:45

+0

你工作在哪個'DBMS'? – Hamidreza

+0

SQL Server 2008 R2,忘了提及,感謝您的通知! – DNac

回答

0

確定的代碼,這個工作對我來說:

WITH HM (HELP_MONTH) AS (
SELECT DATENAME(MONTH,DATEADD(MONTH,-1,GETDATE())) AS HELP_MONTH 
UNION ALL 
SELECT DATENAME(MONTH,DATEADD(MONTH,-2,GETDATE())) AS HELP_MONTH 
UNION ALL 
SELECT DATENAME(MONTH,DATEADD(MONTH,-3,GETDATE())) AS HELP_MONTH 
UNION ALL 
SELECT DATENAME(MONTH,DATEADD(MONTH,-4,GETDATE())) AS HELP_MONTH 
UNION ALL 
SELECT DATENAME(MONTH,DATEADD(MONTH,-5,GETDATE())) AS HELP_MONTH 
UNION ALL 
SELECT DATENAME(MONTH,DATEADD(MONTH,-6,GETDATE())) AS HELP_MONTH 
UNION ALL 
SELECT DATENAME(MONTH,DATEADD(MONTH,-7,GETDATE())) AS HELP_MONTH) 
SELECT HELP_MONTH 
,COUNT(CNT) AS CNT 
FROM HM 
LEFT JOIN YOUR_TABLE ON HM.HELP_MONTH = DATENAME(MONTH, CLOSETIME) 
AND CLOSETIME >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE())-7, '19000101') 
AND CLOSETIME < DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101') 
GROUP BY DATENAME(MONTH, CLOSETIME), HELP_MONTH 
0

使用相同的查詢,通過添加HAVING子句將會添加0計數的記錄。

SELECT DATENAME(MONTH, CLOSETIME) AS CLOSEMONTH, COUNT(*) as CNT 
FROM TABLE 
WHERE CLOSETIME >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE())-7, '19000101') 
AND CLOSETIME < DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101') 
GROUP BY DATENAME(MONTH, CLOSETIME) 
HAVING COUNT(*) >= 0 

謝謝。

+0

那沒有返回預期的輸出。它返回與我的查詢相同的結果。 – DNac

0

下面的查詢可以LEFT JOIN版與您的結果集:

SELECT * FROM 
(
    SELECT 'January' AS month_name, 1 AS month_num 
    UNION 
    SELECT 'February',2 
    UNION 
    SELECT 'Mar',3 
    UNION 
    SELECT 'Apr',4 
    UNION 
    SELECT 'May',5 
    UNION 
    SELECT 'June',6 
    UNION 
    SELECT 'July',7 
    UNION 
    SELECT 'August', 8 
    UNION 
    SELECT 'September', 9 
    UNION 
    SELECT 'October', 10 
    UNION 
    SELECT 'November', 11 
    UNION 
    SELECT 'December', 12 
) 
months 
WHERE month_num <= MONTH(GETDATE()) 
OR month_num > (MONTH(GETDATE()) - 7) % 12 + 12 

上面的查詢提供了近7個月的結果集:

這裏是一個SQL Fiddle