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
+1 si le chèque « dans le passé » est certainement superflu – Andomar
Cela dépend. Les cas futurs ne seront peut-être pas impossibles, et puisque le PO l'a explicitement mentionné ... – Tomalak
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