L'aggregazione condizionale è un compito classico per la reportistica. Inizialmente, per calcolare vari indicatori venivano creati singoli interrogazioni con filtri. Presto è emersa una soluzione più compatta: aggregazione condizionale utilizzando CASE all'interno delle funzioni di aggregazione (ad esempio, SUM(CASE WHEN ...)). Il problema si manifesta quando si combinano filtri, raggruppamenti e sommari: è facile ottenere somme errate o interpretare erroneamente il risultato.
Soluzione: utilizzare l'aggregazione condizionale all'interno delle funzioni di aggregazione. Ad esempio, per visualizzare per tutti i dipendenti il numero di ordini "in lavorazione" e "completati":
SELECT employee_id, SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END) as processing_count, SUM(CASE WHEN status = 'done' THEN 1 ELSE 0 END) as done_count FROM Orders GROUP BY employee_id;
Caratteristiche chiave:
Cosa succede se la condizione CASE restituisce NULL invece di 0?
La funzione di aggregazione SUM ignora NULL. Pertanto, se si scrive CASE WHEN ... THEN 1 END, le righe mancanti non verranno considerate. È meglio assegnare sempre esplicitamente ELSE 0.
SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END)
Può un filtro WHERE modificare la somma finale per stati durante l'aggregazione condizionale?
Sì: se il principale WHERE limita il campione (ad esempio, WHERE region = 'west'), allora i calcoli verranno eseguiti solo sui dati filtrati. Per i totali globali, utilizzare una sottoquery o rimuovere il filtro.
Si può utilizzare HAVING per filtrare le righe prima della raggruppamento?
No. HAVING filtra già i dati raggruppati per aggregati. Il filtraggio delle righe originali avviene tramite WHERE.
Nel report analitico è stato utilizzato:
SUM(CASE WHEN status = 'approved' THEN 1 END)
C'erano molti NULL, le somme finali erano sottostimate. A causa del filtro WHERE, parte delle righe necessarie veniva persa.
Vantaggi:
Svantaggi:
È stato utilizzato:
SUM(CASE WHEN status = 'approved' THEN 1 ELSE 0 END)
Il codice è stato mantenuto in un'unica query, i filtri sui totali - tramite HAVING.
Vantaggi:
Svantaggi: