SQL Server Query ежемесячные итоги - PullRequest
       7

SQL Server Query ежемесячные итоги

6 голосов
/ 26 сентября 2010

У меня есть запрос, который суммирует все дела, которые были активны 01.01.2010.

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

У меня также есть таблица календаря, которую я могу использовать для создания запроса, который возвращает 12 дат, начиная с 1 января, 1 февраля, с 1 марта по 1 декабря

Я не могу понять, как объединить 2 запроса, поэтому я получаю подсчет всех итоговых сумм за 1-е число каждого месяца.

Мне нужно увидеть что-то вроде

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

Ответы [ 3 ]

5 голосов
/ 26 сентября 2010
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 случаев
2 голосов
/ 26 сентября 2010

Если в Календаре есть два столбца, таких как MonthName и FirstDate, вы хотите указать * / 1003 *

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 голос
/ 26 сентября 2010

Вы можете просто сгруппировать по месяцу запроса:

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)
...