2009-10-19 11 views
0

Je dois développer une requête qui comptera le nombre total de cas 'ouverts' par mois. J'ai une table 'cases' avec un identifiant et un nom, et une table 'state_changes' avec une colonne datetime, une colonne caseid et un état.Utiliser SQL pour compter les cas dans un certain état à un certain moment

Comment puis-je calculer le nombre de cas dans chaque mois qui ont un enregistrement avec l'état 'ouvert' dans le passé, mais sans un enregistrement correspondant avec l'état fermé?

J'utilise SQL Server 2000.

Répondre

2

Cela devrait vous approcher (T-SQL):

SELECT 
    MONTH(s.casedate) m, 
    YEAR(s.casedate) y, 
    COUNT(DISTINCT c.caseid) count_cases 
FROM 
    cases c 
    INNER JOIN state_changes s ON s.caseid = c.caseid 
WHERE 
    s.state = 'open'   /* "with state 'open'" */ 
    AND s.casedate < GETDATE() /* "in the past" */ 
    AND NOT EXISTS (   /* "without corresp. record with state 'closed'" */ 
    SELECT 1 FROM state_changes i WHERE i.caseid = s.caseid AND i.state = 'closed' 
) 
GROUP BY 
    MONTH(s.casedate), 
    YEAR(s.casedate) 

EDIT: Pour faire une statistique sur les douze mois (indépendamment des cas réels existants dans ces mois), vous avez besoin d'une petite table d'aide (appelons-le month), qui ne contient rien, mais une colonne (appelons-que month aussi) avec des chiffres de 1 à 12. Ensuite, vous rejoignez contre:

SELECT 
    m.month, 
    COUNT(DISTINCT c.caseid) count_cases 
FROM 
    cases c 
    INNER JOIN state_changes s ON s.caseid = c.caseid 
    LEFT JOIN month   m ON m.month = MONTH(s.casedate) 
WHERE 
    s.state = 'open' 
    AND YEAR(c.createddate) = YEAR(GETDATE()) /* whatever */ 
    AND NOT EXISTS (
    SELECT 1 FROM state_changes i WHERE i.caseid = s.caseid AND i.state = 'closed' 
) 
GROUP BY 
    m.month 
ORDER BY 
    m.month 
+0

+1 si le chèque « dans le passé » est certainement superflu – Andomar

+0

Cela dépend. Les cas futurs ne seront peut-être pas impossibles, et puisque le PO l'a explicitement mentionné ... – Tomalak

+0

Merci, je vais y aller avec ça. Le problème est maintenant que j'ai besoin de connaître le nombre dans un chaque mois, ce qui n'est pas le même que le mois du casedate. Je vais essayer et mettre à jour quand j'ai quelque chose – edosoft

1

Créez une requête des tables de changements d'état pour les événements ouverts et une pour les événements fermés.

Créer une requête qui ne une jointure externe de l'ouverture à la fermeture de l'ID de cas retourner l'ID de cas les deux requêtes

Interrogation ce dernier de résultat de la requête pour les lignes où l'ID de la requête d'événement « close » est nul

Comptez le nombre de lignes dans le résultat de la dernière requête.

Quelque chose de très à peu près comme (du haut de ma tête, sans correction):

SELECT COUNT (T1.CaseID) FROM (SELECT T1.CaseID AS T1_CaseID, T2.CaseID AS T2_CaseID 
FROM ((SELECT CaseID FROM state_changes WHERE state = 'open' AND timestamp BETWEEN 1-Jan-09 AND 30-Jan-09) AS T1 OUTER JOIN (SELECT CaseID FROM state_changes WHERE state = 'closed' AND timestamp BETWEEN 1-Jan-09 AND 30-Jan-09) AS T2 ON T1.CaseID = T2.CaseID)) WHERE T2_CaseID = NULL 
+0

Bien que je doive maintenant comprendre comment grouper par mois – edosoft

Questions connexes