2010-09-26 161 views
6

我有一个查询,总计所有在01/01/2010上处于活动状态的案例。SQL Server查询每月总计

SELECT  COUNT(CaseID) AS Total 
FROM   dbo.ClientCase 
WHERE  (CaseStartDate <= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) AND (CaseClosedDate >= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) OR (CaseClosedDate IS NULL) 
GROUP BY CaseStartDate 

我也有,我可以用它来创建一个返回从1月1日,2月1日,3月1日开始到直通12月1日

我不能工作了12日的查询日历表如何组合2个查询,这样我就可以计算出每月第一天的所有Case总数。

我需要看到类似

Month Total 
Jan  102 
Feb  130 
Mar  145 
..... 
Dec  162 
+1

你说明你正在尝试与此查询完成什么?我的第一个想法是,你可能不需要日历表,而是可以使用SQL日期函数(MONTH,YEAR等)。 – 2010-09-26 01:18:48

+0

@adrift - 我有各种查询,可以计算出一个月初有多少个案例被打开,一个月内有多少个案例被关闭,以及一个月内有多少个案例被创建。如果您看看我的第一个示例,其中总计打开了案例,但是它只是在2010年1月1日之前完成的。我需要第一个查询中的日期遍历一年中的其他11个月。 – Mitch 2010-09-27 18:49:57

回答

5
SELECT cal.MonthName, COUNT(CaseID) AS Total 
FROM dbo.calendarTable cal 
LEFT OUTER JOIN dbo.ClientCase cc 
ON Month(cal.MonthStartDate) = Month(CaseStartDate) 
WHERE 
(CaseStartDate <= CONVERT(DATETIME, cal.MonthStartDate, 102)) AND 
(CaseClosedDate >= CONVERT(DATETIME, cal.MonthStartDate, 102)) OR 
(CaseClosedDate IS NULL) 
GROUP BY cal.MonthName 
  • 左外连接确保您获得包括0个月的所有月份
+0

你的答案是最接近我需要这么多谢谢你的帮助。 – Mitch 2010-09-27 18:43:59

2

假设日历有两列如MonthNameFirstDate,你想她/东西一样

SELECT Calendar.MonthName AS Month, COUNT(ClientCase.CaseId) AS Total, 
    FROM ClientCase 
    JOIN Calendar 
    ON (MONTH(Calendar.FirstDate) = MONTH(ClientCase.CaseStartDate)) 
    GROUP BY Calendar.MonthName 
1

你可以只是简单的集团被查询的月份:

SELECT 
    MONTH(CaseStartDate), COUNT(CaseID) AS Total 
FROM   
    dbo.ClientCase 
WHERE  
    (CaseStartDate <= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) 
    AND (CaseClosedDate >= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) OR 
     (CaseClosedDate IS NULL) 
GROUP BY 
    MONTH(CaseStartDate) 

这应该给你的输出是相当接近(数值个月,而不是一月,二月等等 - 但足够接近)。

有了这个额外的步骤,你会得到的第一个三个字母每个月的名字的:

SELECT 
    SUBSTRING(DATENAME(MONTH, CaseStartDate), 1, 3) AS 'Month', 
    COUNT(CaseID) AS Total 
FROM   
    dbo.ClientCase 
WHERE  
    (CaseStartDate <= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) 
    AND (CaseClosedDate >= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) OR 
     (CaseClosedDate IS NULL) 
GROUP BY 
    MONTH(CaseStartDate), SUBSTRING(DATENAME(MONTH, CaseStartDate), 1, 3) 
ORDER BY 
    MONTH(CaseStartDate)