CASE in ORDER BY e negli aggregati
Ordinamento e conteggio condizionali
CASE in ORDER BY e negli aggregati è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.
Ordinamento con priorità personalizzata
La clausola ORDER BY di SQL normalmente ordina le righe in base al valore naturale di una colonna. Tuttavia, può inserire un'espressione CASE in ORDER BY per creare un ordine di ordinamento completamente personalizzato, che nessuna singola colonna potrebbe produrre da sola.
Questa tecnica è utile quando la priorità è determinata dalle regole di business anziché dai valori grezzi dei dati.
SELECT product_name, status
FROM products
ORDER BY
CASE status
WHEN 'urgent' THEN 1
WHEN 'active' THEN 2
WHEN 'pending' THEN 3
ELSE 4
END;Come funziona CASE all'interno di ORDER BY
Quando il database valuta ORDER BY CASE ... END, calcola un numero intero (o un qualsiasi valore confrontabile) per ogni riga. Le righe vengono quindi ordinate in base a questo valore calcolato anziché, o in aggiunta, a una colonna grezza.
L'espressione CASE non viene memorizzata: esiste solo per la durata della query.
SELECT order_id, priority
FROM orders
ORDER BY
CASE priority
WHEN 'high' THEN 1
WHEN 'medium' THEN 2
WHEN 'low' THEN 3
ELSE 9
END,
order_id;Ordinare esplicitamente i NULL
Per impostazione predefinita, database diversi collocano i NULL all'inizio o alla fine di un risultato ordinato in modi diversi. Un CASE in ORDER BY consente di decidere esattamente dove collocare i NULL, indipendentemente dal motore di database.
SELECT employee_name, manager_id
FROM employees
ORDER BY
CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END,
manager_id;Ordinamento condizionale crescente e decrescente
Un CASE in ORDER BY può anche simulare una direzione condizionale. Associando i valori delle categorie a numeri negativi, può di fatto invertire l'ordine per gruppi specifici mantenendo l'ordine normale per gli altri.
È utile quando diversi tipi di riga richiedono logiche di ordinamento diverse all'interno di un unico insieme di risultati.
SELECT task_name, due_date, is_overdue
FROM tasks
ORDER BY
CASE WHEN is_overdue = 1 THEN 0 ELSE 1 END,
due_date;CASE all'interno di COUNT
Può inserire un'espressione CASE all'interno di una funzione di aggregazione come COUNT. Il trucco consiste nel restituire un valore non NULL per le righe da contare e NULL per quelle da ignorare, perché COUNT ignora i NULL.
SELECT
COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count,
COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;CASE all'interno di SUM — totali condizionali
Inserire CASE all'interno di SUM consente di sommare i valori solo quando una condizione è vera e di trattare le righe che non corrispondono come zero. È un modello molto comune per i report in stile pivot, che suddividono una singola colonna in più colonne di metriche.
SELECT
SUM(CASE WHEN region = 'North' THEN sales_amount ELSE 0 END) AS north_total,
SUM(CASE WHEN region = 'South' THEN sales_amount ELSE 0 END) AS south_total,
SUM(CASE WHEN region = 'East' THEN sales_amount ELSE 0 END) AS east_total
FROM sales;AVG condizionale con CASE
Lo stesso modello funziona con AVG. Poiché AVG ignora i NULL, restituire NULL per le righe da escludere produce la media delle sole righe corrispondenti, senza bisogno di una sottoquery.
SELECT
AVG(CASE WHEN department = 'Engineering' THEN salary END) AS avg_eng_salary,
AVG(CASE WHEN department = 'Marketing' THEN salary END) AS avg_mkt_salary
FROM employees;Raggruppare con CASE — suddividere le righe in categorie
Può usare CASE in GROUP BY o nell'elenco SELECT per suddividere i valori continui in categorie e quindi aggregare ogni categoria. In questo modo trasforma una colonna numerica in gruppi denominati senza modificare i dati sottostanti.
SELECT
CASE
WHEN age < 18 THEN 'Under 18'
WHEN age BETWEEN 18 AND 35 THEN '18-35'
WHEN age BETWEEN 36 AND 55 THEN '36-55'
ELSE '56+'
END AS age_group,
COUNT(*) AS user_count
FROM users
GROUP BY
CASE
WHEN age < 18 THEN 'Under 18'
WHEN age BETWEEN 18 AND 35 THEN '18-35'
WHEN age BETWEEN 36 AND 55 THEN '36-55'
ELSE '56+'
END;Usare un alias invece di ripetere CASE
Ripetere una lunga espressione CASE sia in SELECT sia in GROUP BY è verboso. Alcuni database (MySQL, PostgreSQL con alcune soluzioni alternative) consentono di fare riferimento all'alias in ORDER BY, ma non in GROUP BY. L'approccio portabile più sicuro consiste nel racchiudere la query in una sottoquery o in una CTE e usare GROUP BY sull'alias da lì.
WITH scored AS (
SELECT
customer_id,
CASE
WHEN total_spent >= 1000 THEN 'Gold'
WHEN total_spent >= 500 THEN 'Silver'
ELSE 'Bronze'
END AS tier
FROM customers
)
SELECT tier, COUNT(*) AS customer_count
FROM scored
GROUP BY tier
ORDER BY
CASE tier
WHEN 'Gold' THEN 1
WHEN 'Silver' THEN 2
ELSE 3
END;Combinare ORDER BY CASE con ASC / DESC
Dopo l'espressione CASE può ancora aggiungere ASC o DESC e altre colonne di ordinamento separate da virgole. Il punteggio CASE è solo la prima chiave di ordinamento; le colonne successive risolvono i pari merito nel modo consueto.
SELECT
ticket_id,
category,
created_at
FROM support_tickets
ORDER BY
CASE category
WHEN 'billing' THEN 1
WHEN 'outage' THEN 2
WHEN 'feature' THEN 3
ELSE 4
END ASC,
created_at ASC;Esempio reale — Dashboard delle vendite
Ecco una query realistica che combina un'aggregazione basata su CASE con un ordinamento basato su CASE. Produce un riepilogo delle vendite per regione, ordinato in modo che la regione con i ricavi più elevati compaia sempre per prima, mentre «Altro» venga spostato in fondo.
SELECT
CASE
WHEN region IN ('North', 'South', 'East', 'West') THEN region
ELSE 'Other'
END AS region_label,
SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_sales,
COUNT(CASE WHEN status = 'refunded' THEN 1 END) AS refund_count
FROM orders
GROUP BY
CASE
WHEN region IN ('North', 'South', 'East', 'West') THEN region
ELSE 'Other'
END
ORDER BY completed_sales DESC;Verifica delle conoscenze
Verifichi la Sua comprensione dell'uso di CASE all'interno di ORDER BY e delle funzioni di aggregazione.
Riepilogo della lezione
In questa lezione ha imparato a combinare CASE con ORDER BY e le funzioni di aggregazione:
- CASE in ORDER BY — assegnare punteggi di ordinamento personalizzati alle righe, controllare la posizione dei NULL e combinare più regole di ordinamento in un'unica query.
- CASE in COUNT — restituire un valore non NULL per le righe da includere e NULL, in modo implicito o esplicito, per quelle da saltare.
- CASE in SUM / AVG — usare 0 o NULL come valore ELSE per calcolare totali e medie condizionali in un'unica scansione.
- CASE in GROUP BY — raggruppare valori continui o categorici in gruppi con etichette per l'aggregazione.
Questi schemi eliminano molte sottoquery e rendono semplice scrivere report in stile pivot usando SQL puro.
Domande Frequenti
La lezione «CASE in ORDER BY e negli aggregati» è gratuita?
Sì — il testo completo di «CASE in ORDER BY e negli aggregati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.
Cosa imparerò in «CASE in ORDER BY e negli aggregati»?
Ordinamento e conteggio condizionali Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Academy?
Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «CASE in ORDER BY e negli aggregati»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Academy?
Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- L'espressione CASE
- CASE semplice e con ricerca
- Raggruppare ed etichettare i dati
- CASE in ORDER BY e negli aggregati