Lezioni del modulo (3/4)
Logica condizionale: CASE WHEN
Tutto quello che abbiamo visto finora estrae i dati così come sono. Spesso
però vuoi trasformarli: classificare gli stipendi in fasce, marcare i
nuovi assunti come "junior", tradurre un codice numerico in un'etichetta
leggibile. Lo strumento standard di SQL per questo si chiama CASE WHEN.
La sintassi: un mini if/else
CASE
WHEN condizione_1 THEN valore_1
WHEN condizione_2 THEN valore_2
...
ELSE valore_di_default
ENDSi legge esattamente come un if/else if/else di qualsiasi linguaggio: SQL
valuta le condizioni in ordine e si ferma alla prima vera, restituendo il
relativo valore. Se nessuna è vera, restituisce il valore dell'ELSE. Se
ometti l'ELSE e nessun ramo è vero, restituisce NULL.
-- Classifica i dipendenti per fascia di stipendio:
SELECT first_name,
last_name,
salary,
CASE
WHEN salary >= 50000 THEN 'Senior'
WHEN salary >= 35000 THEN 'Mid'
ELSE 'Junior'
END AS tier
FROM employees;Il CASE vive dentro la SELECT: produce una colonna come una qualsiasi
funzione, ed è normalissimo dargli un alias con AS (qui tier).
Dove si usa CASE
Tre posti ricorrenti:
- Nella
SELECTper creare colonne derivate (l'esempio sopra). - Nell'
ORDER BYper ordini "custom":SQLORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name; -- Prima Ingegneria, poi gli altri, alfabeticamente nel cognome. - Dentro funzioni di aggregazione per "contare condizionalmente":
Questo pattern —SQL
SELECT COUNT(*) AS total, SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior, SUM(CASE WHEN salary < 35000 THEN 1 ELSE 0 END) AS junior FROM employees;SUM(CASE WHEN … THEN 1 ELSE 0 END)— è il "conteggio condizionale" più usato nelle dashboard.
La forma "compatta"
Esiste anche una variante più corta quando confronti una sola espressione con valori esatti:
CASE department_id
WHEN 1 THEN 'Ingegneria'
WHEN 2 THEN 'Vendite'
ELSE 'Altro'
ENDÈ equivalente a CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END, solo più compatta. Funziona solo per uguaglianza esatta: se
serve >= o un altro confronto, devi tornare alla forma estesa.
Prova tu
Per ogni dipendente mostra nome (first_name), cognome (last_name) e una colonna 'tier' che vale 'Alto' se lo stipendio è almeno 50000, altrimenti 'Standard'. Tre colonne, una riga per dipendente.
Mostra suggerimento
La condizione è salary >= 50000. Ricorda di chiudere il CASE con END e di dare l'alias 'tier'.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Per ogni dipartimento (department_id), conta quanti dipendenti hanno stipendio alto (>= 50000) e quanti standard (< 50000) usando SUM(CASE...). Tre colonne: department_id, high, standard. Ordina per department_id (NULLS LAST).
Mostra suggerimento
Il pattern SUM(CASE WHEN ... THEN 1 ELSE 0 END) è il conteggio condizionale.
Soluzione disponibile dopo 3 tentativi