Data Analyst

Da CASE WHEN a SQL: crea categorie aziendali

Trasforma una regola aziendale in una colonna leggibile senza modificare i dati di origine.

Team SQL.tn11min
Query SQL utilizzando CASE WHEN per classificare righe di dati

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.

Le regole e gli importi utilizzati qui sono esempi educativi. Una soglia reale deve essere definita con i responsabili della professione interessata.

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.
Ordina gli ordini per importo
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".

Ordine corretto delle soglie
CASE
  WHEN montant >= 150 THEN 'Alta'
  WHEN montant >= 50 THEN 'Media'
  ELSE 'Basso'
END
Testare sempre i valori limite: 49,99; 50; 149,99 e 150 in questo esempio.

Cosa 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.

Segnala uno stato imprevisto
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.
Conta gli ordini per stato
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.

Fatturato per tranche
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.

Una query può essere valida ma applicare comunque una regola aziendale errata. Chiedi di rileggere le soglie, non solo la sintassi SQL.

Metti in pratica questa guida.

Apri l’esercizio collegato, esegui la query e confronta il risultato atteso.

Inizia l’esercizio