2010-09-26 19 views
6

Mam zapytanie sumujące wszystkie sprawy, które były aktywne w dniu 01.01.2010.Kwartalne miesięczne zapytania 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 

Mam też stół kalendarza, który można używać do tworzenia kwerendy, która zwraca datę 12 począwszy od dnia 1 stycznia, 1 lutego, 1 mar thru do 1 grudnia

nie mogę pracować jak połączyć dwa zapytania, aby uzyskać liczbę wszystkich przypadków w przypadku pierwszego dnia każdego miesiąca.

muszę zobaczyć coś

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

mógłbyś wskazać, co chce osiągnąć z tej kwerendy? Moją pierwszą myślą jest, że nie potrzebujesz tabeli kalendarza, a zamiast tego możesz korzystać z funkcji daty SQL (MIESIĄC, ROK, itp.). –

+0

@adrift - Mam różne zapytania, które sprawdzają, ile spraw było otwartych na początku miesiąca, ile spraw zamknięto w ciągu miesiąca, a ile zostało utworzonych w ciągu miesiąca. Jeśli spojrzysz na mój pierwszy przykład, powyżej którego sumy są otwarte, robi to, co chcę, ale tylko na 1 stycznia 2010. Potrzebuję dat w pierwszym zapytaniu do iteracji przez pozostałe 11 miesięcy w roku. – Mitch

Odpowiedz

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 
  • zewnętrzna lewa dołączyć do upewnij się, że otrzymujesz wszystkie miesiące, w tym 0 przypadków:
+0

Twoja odpowiedź była najbliższa temu, czego potrzebowałem, aby podziękować za twoją pomoc. – Mitch

2

Zakładając Kalendarz ma dwie kolumny, takie jak MonthName i FirstDate, chcesz s/rzeczą jak

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

można po prostu po prostu grupa przez miesiąc zapytania:

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) 

To powinno dać Ci moc, która jest dość blisko (miesiące numeryczne zamiast sty, lut itp - ale na tyle blisko).

Dzięki tym dodatkowym etapie, dostaniesz trzy pierwsze listu nazwy każdego miesiąca:

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) 
Powiązane problemy