2010-09-26 6 views
6

Ich habe eine Abfrage, die alle Fälle auflistet, die am 01.01.2010 aktiv waren.SQL Server Abfrage der monatlichen Gesamtwerte

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 

Ich habe auch eine Kalender-Tabelle, die ich eine Abfrage erstellen können, die von 1. Januar bis zum 1., 1. Februar, 1. März Dezember Ich trainiere nicht

beginnend 12 Tage, kehrt Wie kombiniere ich die 2 Abfragen, so bekomme ich eine Zählung aller Fallzahlen für den 1. eines jeden Monats.

Ich brauche etwas, um zu sehen, wie

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

Können Sie zeigen, was Sie mit dieser Abfrage versuchen zu erreichen? Mein erster Gedanke ist, dass Sie die Calendar-Tabelle möglicherweise nicht benötigen und stattdessen SQL-Datumsfunktionen (MONTH, YEAR usw.) verwenden könnten. –

+0

@adrift - Ich habe eine Vielzahl von Abfragen, die herausfinden, wie viele Fälle zu Beginn eines Monats offen waren, wie viele Fälle während eines Monats geschlossen wurden und wie viele während eines Monats erstellt wurden. Wenn Sie sich mein erstes Beispiel ansehen, bei dem sich Fälle öffnen, tut es das, was ich will, aber nur für den 1. Januar 2010. Ich brauche die Daten in der ersten Abfrage, um die anderen 11 Monate des Jahres zu durchlaufen. – Mitch

Antwort

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 
  • LEFT OUTER JOIN zu Stellen Sie sicher, dass Sie alle Monate erhalten, einschließlich 0 Fälle
+0

Ihre Antwort war die nächste, was ich brauchte so vielen Dank für Ihre Hilfe. – Mitch

2

Unter der Annahme, Kalender hat zwei Spalten wie MonthName und FirstDate, möchten Sie s/Sache wie

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

Sie konnte nur einfach Gruppe durch den Monat der Abfrage:

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) 

Das sollten Sie eine Ausgabe geben, die ganz in der Nähe ist (numerische Monate statt Jan, Feb etc. - aber nah genug).

Mit diesem zusätzlichen Schritt, werden Sie die ersten drei Buchstaben des von den Namen jeden Monats erhalten:

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)