Sql server SQL Server查询每月总计

Sql server SQL Server查询每月总计,sql-server,totals,Sql Server,Totals,我有一个查询,它汇总了2010年1月1日活动的所有案例 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 (CaseC

我有一个查询,它汇总了2010年1月1日活动的所有案例

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

假设日历有两列,例如
MonthName
FirstDate
,那么您需要s/之类的内容

Month   Total
Jan     102
Feb     130
Mar     145
.....
Dec     162
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
选择cal.MonthName,计数(CaseID)作为总计
从dbo.calendarTable cal
左外部联接dbo.ClientCase cc
月(cal.MonthStartDate)=月(CaseStartDate)
哪里
(CaseStartDate=转换(日期时间,cal.MonthStartDate,102))或
(CaseClosedDate为空)
cal.MonthName集团
  • 左外连接,以确保获得所有月份,包括0个案例

您只需按查询月份分组即可:

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)
选择
月份(CaseStartDate),计数(CaseID)为总数
从…起
dbo.ClientCase
哪里
(CaseStartDate=CONVERT(日期时间,'2010-01-01 00:00:00',102))或
(CaseClosedDate为空)
分组
月份(案例开始日期)
这应该会给你一个非常接近的输出(数字月而不是一月,二月等-但足够接近)

通过此附加步骤,您将获得每个月名称的前三个字母:

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)
选择
子字符串(DATENAME(MONTH,CaseStartDate),1,3)为“MONTH”,
将(案例ID)计为总数
从…起
dbo.ClientCase
哪里
(CaseStartDate=CONVERT(日期时间,'2010-01-01 00:00:00',102))或
(CaseClosedDate为空)
分组
月(CaseStartDate),子字符串(DATENAME(月,CaseStartDate),1,3)
订购人
月份(案例开始日期)

您能否指出您试图通过此查询完成的任务?我的第一个想法是,您可能不需要日历表,而是可以使用SQL日期函数(月、年等)。@adrift-我有各种查询,可以计算出一个月初打开了多少个案例,一个月内关闭了多少个案例,以及一个月内创建了多少个案例。如果你看一下我上面的第一个例子,上面列出了未结案件的总数,它符合我的要求,但只适用于2010年1月1日。我需要第一个查询中的日期来遍历一年中的其他11个月。你的答案与我所需要的最接近。非常感谢你的帮助。
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)