Question
J'ai une requête avec les tables suivantes (réduite pour afficher uniquement les colonnes intéressées).
t1
code
t2
code, period, status
t3
period, desc
Maintenant, ce que j'ai est,
t3 est un tableau de "périodes" uniques.
t1 est une table de codes uniques.
t2 est la table de jointure reliant les deux, ainsi qu’un statut, par exemple, status = (A, B, C).
Ce que je fais est de créer un résultat de requête qui est regroupé par "période". et a le nombre de "codes" dans chaque statut.
C’est facile à résoudre, mais j’aimerais élargir ce domaine, c’est d’avoir non seulement un nombre de codes dans A, B et C, mais également un nombre de codes qui ne sont pas associés à un point ou à une période. en d'autres termes, un nombre de codes qui ne sont pas dans t2 pendant une période donnée.
Le résultat recherché est donc
Period A B C (Codes from t1 not found in t2)
P1 10 5 2 3
P2 5 5 5 10
La solution
Vous pouvez utiliser la jonction croisée pour sélectionner une matrice de tous les codes pour toutes les périodes. Cela vous permet de compter les lignes qui ne sont pas présentes:
select
sum(case when t2.status is 'A' then 1 else 0 end) as ACount,
sum(case when t2.status is 'B' then 1 else 0 end) as BCount,
...
sum(case when t2.code is null then 1 else 0 end) as NotPresentCount
from t1
cross join t3
left join t2
on t2.code = t1.code and t2.period = t3.period
group by t3.period