2010-09-26 16 views
6

J'ai une requête qui totalise tous les cas qui étaient actifs le 01/01/2010.Requêtes SQL Server Totaux mensuels

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 

Je également une table de calendrier que je peux utiliser pour créer une requête qui renvoie 12 dates à partir du 1er janvier 1 février, 1 mars au 1 décembre à travers

Je ne peux pas travailler comment combiner les 2 requêtes de manière à obtenir le nombre de totaux de cas pour le 1er de chaque mois.

Je dois voir quelque chose comme

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

Pourriez-vous indiquer ce que vous essayez d'accomplir avec cette requête? Ma première pensée est que vous pourriez ne pas avoir besoin de la table Calendar et que vous pourriez utiliser les fonctions de date SQL (MONTH, YEAR, etc.). –

+0

@adrift - J'ai une variété de requêtes qui déterminent le nombre de dossiers ouverts au début d'un mois, combien de dossiers ont été fermés pendant un mois et combien ont été créés au cours d'un mois. Si vous regardez mon premier exemple ci-dessus qui totalise les cas ouverts, il fait ce que je veux mais seulement pour le 1er janvier 2010. J'ai besoin des dates dans la première requête pour parcourir les 11 autres mois de l'année. – Mitch

Répondre

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 
  • jointure externe gauche à assurez-vous que vous obtenez tous les mois, y compris avec 0 cas
+0

Votre réponse était la plus proche de ce dont j'avais besoin, merci pour votre aide. – Mitch

2

En supposant le calendrier a deux colonnes telles que MonthName et FirstDate, vous voulez s/chose comme

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

Vous pourriez tout simplement groupe par le mois de la requête:

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) 

Cela devrait vous donner une sortie qui est tout à fait près (au lieu de mois numériques janvier, février, etc. - mais assez proche).

Avec cette étape supplémentaire, vous obtenez les trois premières lettres de du nom de chaque mois:

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)