Torna all'elenco degli articoli Articoli
Tempo di lettura: 6 minuti

Utilizzo di GROUP BY in SQL

Ora che conoscete i comandi principali di SQL, potenziate le vostre query con la clausola GROUP BY e le funzioni aggregate.

GROUP BY è una clausola SQL che organizza i dati in gruppi basati su uno o più valori comuni. È molto utilizzata per ottenere informazioni di riepilogo su grandi insiemi di dati e per calcolare statistiche aggregate di base.

Una volta acquisiti i comandi di base di SQL, come SELECT, WHERE e JOIN, la padronanza della clausola GROUP BY può aiutare a implementare le conoscenze di SQL in scenari di business intelligence reali.

La clausola SQL GROUP BY viene usata più spesso in combinazione con funzioni aggregate come COUNT(), MAX(), MIN(), SUM() e AVG(). Raggruppa il set di risultati in base a una o più colonne, creando essenzialmente righe di riepilogo per ogni gruppo. Questi gruppi sono solitamente basati su valori categorici piuttosto che continui.

Ad esempio, se si utilizza un set di dati di clienti globali per la propria azienda, è possibile utilizzare la clausola GROUP BY per riassumere informazioni quali il "numero totale di clienti per ciascun paese" o le "vendite totali per cliente".

Sintassi GROUP BY

Ora che sappiamo cos'è la clausola GROUP BY, vediamo la sintassi di una query GROUP BY di base.

SELECT column_name(s)
FROM table_name
WHERE [condition]
GROUP BY column_name1, column_name2
HAVING [condition]
ORDER BY column_name

Ecco:

  • SELECT è la query SQL standard SELECT.
  • GROUP BY column_name1 esegue il raggruppamento in base ai valori in column_name1.
  • column_name2 si usa quando il raggruppamento viene fatto su più di una colonna; si può raggruppare per qualsiasi numero di colonne. È opzionale.
  • HAVING [condition] e WHERE [condition] sono anch'esse facoltative; entrambe vengono utilizzate per limitare le righe interessate dalla clausola GROUP BY. La differenza fondamentale è che WHERE filtra le righe prima del raggruppamento, mentre HAVING filtra i gruppi stessi una volta formati. Importante: WHERE deve precedere la clausola GROUP BY e HAVING deve seguirla.
  • ORDER BY [condition] viene utilizzato dopo GROUP BY per ordinare i dati in base a un dato column_name.

A prima vista, GROUP BY e ORDER BY sembrano fare la stessa cosa: ordinare i dati. Ma le loro somiglianze finiscono qui. Come suggerisce il nome, ORDER BY ordina semplicemente l'intero set di dati in un ordine definito, mentre GROUP BY raggruppa i dati come output aggregato. Il nostro precedente articolo, La differenza tra GROUP BY e ORDER BY in parole semplici, lo spiega in modo più dettagliato; consultatelo se avete bisogno di un ripasso.

Vediamo ora come funziona la clausola GROUP BY con query reali.

GRUPPO PER UNA SINGOLA COLONNA

Per comprendere l'effetto della clausola GROUP BY, eseguiamo una semplice query sulla tabella Orders che ha registrato 196 ordini individuali. Di seguito sono riportate le prime cinque voci della tabella:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
102489051996-07-043
102498161996-07-051
102503441996-07-082
102518431996-07-081
102527641996-07-092

Utilizzando la tabella Orders scopriamo quanti clienti unici hanno effettuato un ordine. Ecco la query:

SELECT CustomerID 
FROM Orders
GROUP BY CustomerID

RISULTATO

Number of Records: 74
CustomerID
2
3
4
5
7

Questo è un esempio di una semplice clausola GROUP BY su una singola colonna (CustomerID); l'output colloca tutte le righe con lo stesso valore per la colonna CustomerID nello stesso gruppo. Inoltre, restituisce il numero di clienti unici che hanno effettuato un ordine (74). In sostanza, una clausola GROUP BY senza una funzione aggregata si comporta in modo simile a una clausola DISTINCT: trova i valori unici in una colonna.

Il raggruppamento può essere fatto anche in base a più colonne. Questo è più utile quando viene utilizzato con le funzioni aggregate.

Raggruppamento con le funzioni aggregate

L'applicazione pratica del comando GROUP BY di SQL consiste nel riassumere i parametri statistici per gruppi di dati; di solito questo si ottiene con le funzioni aggregate. Esploreremo ora alcuni esempi, utilizzando le tabelle e il comando Orders e la tabella OrderDetails un esempio di tabella è mostrato di seguito:

OrderDetailIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
410249149
5102495140

MAX(), MIN(), AVG(), SUM()

GROUP BY è perfetta per riassumere i parametri statistici di singole categorie nel vostro set di dati. Ad esempio, cerchiamo di trovare la quantità massima, minima e media di ogni ProductID per ordine e il numero totale di ogni prodotto ordinato. Utilizzeremo la tabella OrderDetails e metteremo i risultati in ordine decrescente in base alla somma delle quantità ordinate per ogni prodotto. In questo modo si potrà capire quali sono i prodotti più popolari di ProductIDs. Ecco la query:

SELECT ProductID, MAX(Quantity), Min(Quantity), AVG(Quantity), SUM (Quantity)
FROM OrderDetails
GROUP BY ProductID
Order By SUM(Quantity) DESC

RISULTATO

Number of Records: 77
ProductIDMAX(Quantity)Min(Quantity)AVG(Quantity)SUM (Quantity)
3170432.714285714285715458
6080635.833333333333336430
35100441369
5970624.714285714285715346
260731341

La tabella seguente illustra come vengono calcolati alcuni di questi valori aggregati per i valori 2 e 31 di ProductID. La clausola GROUP BY raggruppa prima le righe per ProductID 2 e poi calcola AVG() e MAX() per l'intero gruppo. Lo stesso avviene per ogni ProductID per ciascuna delle funzioni aggregate della query.

ProductIDQuantityAverage (?Quantity/# of ProductID)Max (Quantity)
2603160
250
245
240
235
…………
317032.71470
3160
3156
3142
3140
…………

Come si vede, il comando GROUP BY è uno strumento estremamente utile per trovare sommatorie statistiche per qualsiasi classe di variabili.

GRUPPO PER COLONNE MULTIPLE con COUNT()

Come accennato in precedenza, è possibile utilizzare più colonne nel comando GROUP BY. In altre parole, tutte le righe con gli stessi valori in column_name1 e column_name2 vengono raggruppate in un unico gruppo.

Consideriamo un esempio in cui vogliamo contare il numero di volte in cui ogni dipendente ha utilizzato un servizio di spedizione. Ancora una volta, utilizzeremo la tabella Orders tabella.

SELECT EmployeeID, ShipperID, COUNT(*)
FROM Orders
Group BY EmployeeID, ShipperID
Order BY ShipperID, Count(*) DESC

RISULTATO

Number of Records: 26
EmployeeIDShipperIDCOUNT(*)
4112
118
217
317
617
…….…….…….

Questa query potrebbe essere utilizzata, ad esempio, per ottenere un feedback sul servizio clienti degli spedizionieri da parte dei dipendenti che hanno utilizzato tale servizio. Come si può vedere, ci sono 26 coppie di interazioni uniche tra dipendenti e spedizionieri!

Come funziona il raggruppamento per due colonne dietro le quinte? Le righe con gli stessi EmployeeID e ShipperID vengono raggruppate in un unico gruppo. La dimensione di questi gruppi (cioè il numero di record nel gruppo) viene calcolata, come si può vedere qui sotto:

EmployeeIDShipperIDCount
11
11
1112
11
11
………….
41
41
418
41
41
………….

Il comando GROUP BY è anche un potente strumento che può essere combinato con le clausole SQL HAVING e WHERE per definire condizioni aggiuntive per i risultati restituiti.

Si tenga presente che ci sono alcune sottigliezze quando GROUP BY viene utilizzato con colonne che hanno NULL valori. Per ulteriori dettagli si rimanda al nostro precedente articolo sugli errori comuni di GROUP BY .

Padroneggiare SQL GROUP BY

Inutile dire che solo la pratica vi permetterà di padroneggiare questo comando! La pratica è preferibile farla su insiemi di dati del mondo reale, dove è possibile visualizzare e mettere in relazione con le esigenze aziendali. Il corso SQL Basics corso include una serie completa di esercizi interattivi. Imparerete a raggruppare le righe e a calcolare le statistiche con le funzioni aggregate su insiemi di dati pratici. Provatelo e buona fortuna!