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

GROUP BY in SQL spiegato

L'istruzione SQL GROUP BY è facile da usare, ma può essere difficile da padroneggiare. Scoprite cosa si può fare con GROUP BY, come funziona e come usarlo con le funzioni aggregate.

GROUP BY è uno degli strumenti SQL di base. Tuttavia, per i principianti potrebbe essere difficile capire come funziona GROUP BY e come viene utilizzato per calcolare le statistiche con diverse funzioni aggregate. In questo articolo, utilizzerò diversi esempi per mostrare esattamente come GROUP BY organizza le righe e come le funzioni aggregate possono essere utilizzate per calcolare le statistiche su una o più colonne.

Quindi, iniziamo.

Come funziona SQL GROUP BY?

GROUP BY è uno strumento indispensabile per ogni analista di dati che lavora con SQL. Se si desidera organizzare i dati in gruppi e calcolare qualche tipo di statistica aggregata per questi gruppi, la clausola GROUP BY è ciò che serve.

Che cosa fa GROUP BY? In pratica, raggruppa le righe con lo stesso valore in un unico gruppo o bucket. Vediamo come funziona.

Supponiamo di gestire una libreria e di voler sapere quanti libri di diverso genere abbiamo in magazzino. Il nostro database include una tabella che elenca i titoli dei libri, i generi e le quantità in magazzino.

La visualizzazione qui sotto mostra come la clausola GROUP BY crea gruppi dai dati della tabella. Vogliamo conoscere la quantità totale di libri per ogni genere; quindi, GROUP BY raggruppa i libri dello stesso genere e somma le quantità corrispondenti. Si crea così una tabella di risultati che elenca i generi e la quantità totale di libri presenti nel nostro magazzino.

GRUPPO PER SOMMA

Per un'introduzione più dettagliata all'argomento GROUP BY, vedere questo video tutorial della serie "Impariamo SQL".

GROUP BY in azione

Ora è il momento di esempi più specifici di query SQL con la clausola GROUP BY. Utilizzeremo la tabella books che contiene l'ID, il titolo, l'autore, il genere, la lingua, il prezzo e la quantità di ogni romanzo che abbiamo in magazzino.

idtitleauthorgenrelangpriceqty
1Les Trois MousquetairesAlexandre Dumasadventurefr11.904
2A Game of ThronesGeorge R.R. Martinfantasyen8.495
3Pride and PrejudiceJane Austenromanceen9.992
4Vampire AcademyRichelle Meadfantasyen7.993
5IvanhoeWalter Scottadventureen9.993
6ArmanceStendhalromancefr5.881

Per calcolare il numero totale di libri di ogni genere, utilizzeremo la seguente query:

SELECT genre, SUM(qty) AS total
FROM books
GROUP BY genre;

Qui, nella clausola GROUP BY, selezioniamo le righe da raggruppare in base alla colonna genere. Quindi la funzione SUM(qty) nell'istruzione SELECT somma i valori di quantità all'interno di ogni gruppo (cioè ogni genere di libro) e il risultato viene visualizzato nel campo corrispondente total:

genretotal
adventure7
fantasy8
romance3

Uso delle funzioni aggregate con GROUP BY

GROUP BY mette le righe con lo stesso valore in un unico gruppo. Di solito si desidera calcolare alcune statistiche per questo gruppo di righe, come il valore medio o la quantità totale. A questo scopo, SQL fornisce funzioni aggregate che combinano i valori di una certa colonna in un unico valore per il rispettivo gruppo.

Finora abbiamo usato solo SUM() come funzione aggregata per raggruppare i titoli di libri in magazzino. Tuttavia, questa non è l'unica funzione aggregata che si può usare con GROUP BY. SQL offre anche:

  • COUNT() calcolare il numero di righe in ogni gruppo.
  • AVG() trovare il valore medio per ogni gruppo
  • MIN() restituire il valore minimo di ogni gruppo
  • MAX() restituire il valore massimo di ogni gruppo.

Vediamo come funziona la funzione AVG() con GROUP BY. Questa volta vogliamo calcolare il prezzo medio dei libri di ogni genere. Cominciamo a visualizzare l'output che vogliamo ottenere.

GRUPPO PER avg

Raggruppiamo ancora una volta i libri per genere, ma questa volta vogliamo calcolare il prezzo medio dei libri per ogni genere. La query SQL è la seguente:

SELECT genre, AVG(price) AS avg_price
FROM books
GROUP BY genre;

Questa query crea una tabella con due colonne (genere e avg_price), in cui il prezzo medio viene calcolato calcolando la media dei prezzi dei libri di ciascun genere:

genreavg_price
adventure10.945
fantasy8.24
romance7.935

In realtà, non siamo limitati a usare una sola funzione aggregata con la clausola GROUP BY. Aggiungiamo quindi le informazioni sul prezzo minimo e massimo dei libri di ciascun genere:

SELECT genre, 
MIN(price) AS min_price, 
     AVG(price) AS avg_price, 
MAX(price) AS max_price
FROM books
GROUP BY genre;

L'insieme dei risultati comprende ora quattro colonne: genre, min_price, avg_price, e max_price.

genremin_priceavg_pricemax_price
adventure9.9910.94511.90
fantasy7.998.248.49
romance5.887.9359.99

Si noti che quando si usa GROUP BY l'istruzione SELECT può includere solo i campi utilizzati nella funzione aggregata o elencati nella clausola GROUP BY . Ad esempio, nel nostro caso, non possiamo aggiungere title o author al nostro insieme di risultati. Non ha senso, perché ogni riga della tabella di output include informazioni su diversi libri con titoli e autori diversi.

Per conoscere altri problemi che si possono incontrare quando si utilizza GROUP BY in SQL, consultate questo articolo che illustra i più comuni errori di GROUP BY e come evitarli.

Raggruppamento per due colonne

In SQL è possibile raggruppare i dati utilizzando più colonne. Ad esempio, supponiamo di voler raggruppare i libri non solo per genere ma anche per lingua. E vogliamo calcolare il numero di titoli di libri in ciascuna categoria.

Suggerimento: la funzione aggregata COUNT() ci aiuterà a calcolare il numero di titoli di libri (cioè di righe).

Per calcolare il numero di titoli di libri per genere e lingua, utilizzeremo la seguente query:

SELECT genre, lang, count(title) AS titles
FROM books
GROUP BY genre, lang;

Otterremo una tabella di output con tre colonne: genre, lingua (lang), e il numero di titles in quella categoria:

genrelangtitles
adventureen1
adventurefr1
fantasyen2
romanceen1
romancefr1

Quindi, nel nostro set di dati di esempio, abbiamo:

  • Un titolo di libro in lingua inglesenel genere avventura(Ivanhoe).
  • Un titolo di libro in lingua francese nel genere avventura (Les Trois Mousquetaires).
  • Due titoli di libri in lingua inglese di genere fantasy(A Game of Thrones e Vampire Academy).
  • Un titolo in lingua inglese nel genere romance (Pride and Prejudice).
  • Un titolo in lingua francese nel genere romance (Armance).

Come si può notare, non ci sono libri fantasy in lingua francese nel nostro set di dati.

Per ulteriori esempi di applicazioni di GROUP BY, consultate questo articolo che mostra come GROUP BY può essere sfruttato in scenari aziendali realistici.

Pronti a usare GROUP BY in SQL?

Ora avete capito meglio come GROUP BY può aiutarvi a organizzare e analizzare i vostri dati. Tuttavia, se volete gestire GROUP BY come un professionista, dovete fare molta pratica.

LearnSQL.it offre un SQL Basics che comprende 129 esercizi interattivi su aggregazione, raggruppamento, JOIN, subquery e altro ancora. Questo corso è un'occasione perfetta per imparare a raggruppare le righe e a calcolare le statistiche con le funzioni aggregate.

Buon apprendimento!