2010-09-26 21 views
6

Ho una query che ammonta a tutti i casi attivi il 01/01/2010.Totali mensili query 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 

Ho anche un tavolo calendario che posso usare per creare una query che restituisce 12 date a partire dal 1 gennaio, 1 febbraio, 1 marzo thru al 1 dicembre

non posso lavorare fuori come combinare le 2 query in modo da ottenere un conteggio di tutti i totali del caso per il 1 ° di ogni mese.

ho bisogno di vedere qualcosa di simile

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

Potrebbe indicare ciò che si sta cercando di realizzare con questa ricerca? Il mio primo pensiero è che potresti non aver bisogno della tabella del calendario e invece potresti usare le funzioni di data SQL (MONTH, YEAR, ecc.). –

+0

@adrift - Ho una serie di query che determinano quanti casi sono stati aperti all'inizio di un mese, quanti casi sono stati chiusi durante un mese e quanti sono stati creati durante un mese. Se guardi il mio primo esempio sopra il totale dei casi aperti, fa quello che voglio, ma solo per il 1 ° gennaio 2010. Ho bisogno delle date nella prima query per iterare attraverso gli altri 11 mesi dell'anno. – Mitch

risposta

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 
  • join esterno sinistro a assicurati di ottenere tutti i mesi incluso 0 casi
+0

La tua risposta è stata la cosa più vicina a ciò di cui avevo bisogno così tante grazie per il tuo aiuto. – Mitch

2

Supponendo Calendar ha due colonne, come MonthName e FirstDate, si vuole s/cosa come

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

Si potrebbe semplicemente di gruppo entro il mese di query:

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) 

Questo dovrebbe dare un output che è abbastanza vicino (mesi numerico invece di gennaio, febbraio, ecc - ma abbastanza vicino).

Con questo ulteriore passo, si otterrà i primi tre della del nome di ogni mese lettera:

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) 
Problemi correlati