GROUP BY
Ragionare per gruppi
Sezione intitolata “Ragionare per gruppi”GROUP BY serve quando non vuoi guardare le righe una per una, ma vuoi raggrupparle.
Immagina una pila di schede clienti. Invece di leggerle in ordine, le dividi per città: Roma da una parte, Milano da un’altra, Torino da un’altra ancora.
SQL fa la stessa cosa con GROUP BY.
SELECT citta, COUNT(*) AS numero_clientiFROM clientiGROUP BY citta;Questa query dice:
“Raggruppa i clienti per città e conta quanti clienti ci sono in ogni città.”
Un esempio con una tabella
Sezione intitolata “Un esempio con una tabella”Partiamo da questi dati:
| nome | citta |
|---|---|
| Luca | Roma |
| Marta | Milano |
| Sara | Roma |
La query:
SELECT citta, COUNT(*) AS numero_clientiFROM clientiGROUP BY citta;produce:
| citta | numero_clienti |
|---|---|
| Milano | 1 |
| Roma | 2 |
SQL crea un gruppo per ogni città. Poi COUNT(*) conta quante righe ci sono in ciascun gruppo.
Perché va spesso insieme alle aggregate
Sezione intitolata “Perché va spesso insieme alle aggregate”GROUP BY da solo crea i gruppi. Le funzioni aggregate fanno i calcoli dentro quei gruppi.
Per esempio:
COUNT(*)conta quante righe ci sono nel gruppo.SUM(totale)somma i totali del gruppo.AVG(prezzo)calcola la media del gruppo.
Per questo GROUP BY è così usato nei report.
Una regola da ricordare
Sezione intitolata “Una regola da ricordare”Quando usi GROUP BY, nel SELECT metti di solito:
- la colonna con cui stai raggruppando
- una o più funzioni aggregate
Questa query è chiara:
SELECT citta, COUNT(*) AS numero_clientiFROM clientiGROUP BY citta;Questa invece crea confusione:
SELECT citta, nome, COUNT(*)FROM clientiGROUP BY citta;Il problema è nome. Se a Roma ci sono Luca e Sara, quale nome dovrebbe mostrare SQL per il gruppo “Roma”?
Quando raggruppi, stai lasciando il dettaglio delle singole righe. Per questo devi mostrare il gruppo e i calcoli sul gruppo.
Raggruppare per più colonne
Sezione intitolata “Raggruppare per più colonne”Puoi anche raggruppare usando più colonne:
SELECT citta, stato, COUNT(*) AS numero_clientiFROM clientiGROUP BY citta, stato;Qui SQL crea un gruppo per ogni combinazione di citta e stato.
È come dividere prima le schede per città e poi, dentro ogni città, separarle per stato.
Riepilogo rapido
Sezione intitolata “Riepilogo rapido”GROUP BYraggruppa righe con lo stesso valore.- Si usa spesso con
COUNT(),SUM(),AVG(),MIN()eMAX(). - Nel
SELECTmostri le colonne di raggruppamento e i calcoli aggregati. - Puoi raggruppare anche per più colonne.