CASE WHEN traduce una regola in un valore
Un rapporto deve spesso raggruppare i valori grezzi in categorie comprensibili: ordine piccolo, medio o grande; cliente attivo o inattivo; obiettivo raggiunto o meno.
L'espressione CASE valuta le condizioni in ordine e restituisce il valore associato alla prima condizione vera. Crea una colonna di risultati senza modificare la tabella di origine.
La sintassi completa di CASE WHEN
Ciascun ramo inizia con WHEN, descrive una condizione e quindi riporta il risultato dopo THEN. ELSE copre tutti i casi rimanenti e END chiude l'espressione.
Un alias posizionato dopo FINE fornisce un nome utilizzabile alla nuova colonna.
- CASE inizia l'espressione.
- QUANDO definisce una condizione.
- THEN fornisce il risultato corrispondente.
- ELSE elabora le altre righe.
- END chiude l'espressione.
SELECT
id_commande,
montant,
CASE
WHEN montant >= 150 THEN 'Alta'
WHEN montant >= 50 THEN 'Media'
ELSE 'Basso'
END AS tranche_montant
FROM commandes
ORDER BY id_commande ASC;L'ordine delle condizioni determina il risultato
CASE si ferma alla prima condizione vera. In questo esempio le soglie devono pertanto essere scritte dalla più restrittiva alla più ampia.
Se montant >= 50 apparisse prima di montant >= 150, un ordine di 200 soddisferebbe immediatamente il primo ramo e sarebbe classificato come "Medio".
CASE
WHEN montant >= 150 THEN 'Alta'
WHEN montant >= 50 THEN 'Media'
ELSE 'Basso'
ENDCosa succede senza ELSE?
Quando nessuna delle condizioni è vera e non è presente ELSE, CASE restituisce NULL. Questo comportamento può essere volontario, ma deve essere anticipato nei successivi filtri e aggregazioni.
L'aggiunta di ELSE spesso rende la regola più semplice da controllare. Un’etichetta come “Non classificato” rivela anche valori che non rientrano in nessuna categoria prevista.
SELECT
id_commande,
CASE
WHEN statut = 'Pagato' THEN 'Completata'
WHEN statut = 'In attesa' THEN 'Da gestire'
ELSE 'Da verificare'
END AS suivi
FROM commandes;Costruire un KPI con aggregazione condizionale
CASE può restituire 1 quando la condizione è vera e 0 altrimenti. SUM aggiunge quindi questi flag per contare le righe che soddisfano la regola.
Questa tecnica consente di calcolare più KPI su un'unica riga e su un unico ambito, senza moltiplicare le query.
- COUNT(*) fornisce il volume totale.
- Ogni CASO produce un indicatore 0 o 1.
- SUM trasforma questi indicatori in contatori.
SELECT
COUNT(*) AS nombre_commandes,
SUM(CASE WHEN statut = 'Pagato' THEN 1 ELSE 0 END) AS commandes_payees,
SUM(CASE WHEN statut = 'In attesa' THEN 1 ELSE 0 END) AS commandes_en_attente
FROM commandes;Risultati del raggruppamento per segmento calcolato
Un'espressione CASE può fungere da dimensione in un report. Raggruppandoli si ottiene una riga per fetta accompagnata da un volume, un totale o una media.
A seconda del motore SQL, l'alias non è sempre accettato in GROUP BY. La ripetizione dell'espressione rimane una soluzione esplicita e portabile.
SELECT
CASE
WHEN montant >= 150 THEN 'Alta'
WHEN montant >= 50 THEN 'Media'
ELSE 'Basso'
END AS tranche_montant,
COUNT(*) AS nombre_commandes,
SUM(montant) AS chiffre_affaires
FROM commandes
GROUP BY
CASE
WHEN montant >= 150 THEN 'Alta'
WHEN montant >= 50 THEN 'Media'
ELSE 'Basso'
END
ORDER BY chiffre_affaires DESC;CASE non sostituisce sempre WHERE
Utilizzare WHERE quando è necessario rimuovere semplicemente le righe. CASE è più adatto quando è necessario produrre un valore diverso a seconda della riga o calcolare più indicatori condizionali.
Un'espressione CASE nidificata inutilmente rende difficile la rilettura della regola. Preferisci diversi rami semplici e nomi di categoria inequivocabili.
- WHERE seleziona un perimetro.
- CASE classifica o trasforma un valore.
- CASE in SUM o COUNT costruisce un flag condizionale.
- Una tabella di riferimento diventa preferibile quando le regole sono numerose e cambiano spesso.
Controlla una regola CASE prima di pubblicarla
Elenca le categorie previste, testa ciascuna soglia esatta e controlla i valori NULL. Quindi confrontare i segmenti totali con il numero di record restituiti dall'ambito.
Gli errori più comuni sono condizioni nell'ordine sbagliato, ELSE mancante, risultati di tipi incompatibili o soglie che lasciano scoperto un intervallo.
Metti in pratica questa guida.
Apri l’esercizio collegato, esegui la query e confronta il risultato atteso.
