2014-03-04 66 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