Domanda
Ho una query con le seguenti tabelle (ridotte per mostrare solo le colonne interessate).
t1
code
t2
code, period, status
t3
period, desc
Ora quello che ho è
t3 è una tabella di "periodi" unici
t1 è una tabella di codici univoci.
t2 è la tabella di join che collega entrambi insieme, insieme a uno stato, per amor di questo esempio status = (A, B, C).
Quello che sto facendo è creare un risultato della query raggruppato per "periodo" e ha il conteggio dei "codici" in ogni stato.
Questo è facile da risolvere, ma voglio estenderlo a, è avere non solo un conteggio di "codici in A, B e C, ma anche un conteggio dei codici che NON SONO associati a un punto o in altre parole, un conteggio dei codici che non sono in t2 per un determinato periodo.
Quindi il risultato che sto cercando è
Period A B C (Codes from t1 not found in t2)
P1 10 5 2 3
P2 5 5 5 10
Soluzione
Puoi usare il cross join per selezionare una matrice di tutti i codici per tutti i periodi. Ciò ti consente di contare le righe che non sono presenti:
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