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
Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top