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
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top