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

5 esempi di GROUP BY

Quando si inizia a imparare SQL, ci si imbatte rapidamente nella clausola GROUP BY. Il raggruppamento dei dati, o aggregazione dei dati, è un concetto importante nel mondo dei database. In questo articolo vi mostreremo come utilizzare la clausola GROUP BY nella pratica. Abbiamo raccolto cinque esempi di GROUP BY, da quelli più semplici a quelli più complessi, in modo che possiate vedere il raggruppamento dei dati in uno scenario reale. Inoltre, imparerete qualcosa sulle funzioni aggregate e sulla clausola HAVING.

SQL è un linguaggio universale per parlare con i database che esiste da quasi 50 anni. Se siete dei principianti, prima di leggere questo articolo prendete in considerazione il nostro corso SQL Basics .

Uno dei concetti fondamentali di SQL è il raggruppamento dei dati, o aggregazione dei dati. Se state leggendo questo articolo, probabilmente avete già sentito parlare della clausola GROUP BY. Per aiutarvi a comprenderla meglio, abbiamo presentato cinque problemi aziendali e mostrato come possono essere risolti nei nostri esempi GROUP BY.

Se avete bisogno di una rapida introduzione a GROUP BY, guardate il nostro video di cinque minuti su YouTube.

In questo articolo, aiuteremo un museo immaginario ad analizzare i suoi ospiti. Utilizzeremo la cronologia delle visite al museo per ricavare informazioni significative utilizzando la clausola GROUP BY. Mettiamoci al lavoro, allora!

Dati in ingresso

Lavoreremo con una singola tabella denominata visit. Ogni riga rappresenta una singola visita al museo. Di seguito, si possono vedere alcune righe di esempio di questa tabella:

visit

datepriceduration
2020-05-01215
2020-05-01437
2020-05-06724
...

Come si può vedere, la tabella non è molto complicata. Contiene solo tre colonne:

  • data: ladata della visita al museo.
  • prezzo - Ilprezzo pagato per il biglietto in dollari (si vedranno diversi prezzi perché il museo utilizza diverse opzioni di prezzo in vari giorni e molti tipi di biglietti ridotti).
  • durata: ladurata della visita al museo in minuti.

A proposito, se conoscete già le istruzioni SQL di base e volete invece provare a creare tabelle, date un'occhiata a questo corso LearnSQL.it Table Basics.

Perché raggruppare le righe?

Sappiamo che in SQL possiamo aggregare (raggruppare) le righe, ma perché lo facciamo? La clausola GROUP BY viene utilizzata insieme alle funzioni di aggregazione, che calcolano varie statistiche sui gruppi di righe. Le cinque funzioni aggregate più importanti in SQL sono:

  • COUNT()-Utilizzate per contare il numero di righe.
  • AVG()-Utilizzate per trovare il valore medio.
  • MIN() e MAX()- Utilizzate per trovare il valore minimo e massimo, rispettivamente.
  • SUM()-Utilizzato per trovare la somma di tutti i valori.

In breve, si raggruppano le righe per calcolare varie statistiche.

Esempi di GROUP BY

Bene. Ora che sappiamo qualcosa sulle funzioni aggregate, vediamo cinque esempi di GROUP BY.

Esempio 1: GROUP BY con una colonna

Cominciamo con un esempio semplice. Vogliamo scoprire quante persone hanno visitato il museo in ogni giorno. In altre parole, per ogni data, vogliamo mostrare il numero di visite al museo. La query di cui abbiamo bisogno sarà simile a questa:

SELECT date, COUNT(*)
FROM visit
GROUP BY date;

Abbiamo solo due colonne: date e count. COUNT(*) significa "conta tutto". Poiché utilizziamo anche la colonna data nella clausola GROUP BY, vedremo un conteggio separato per ogni data. Quando eseguiamo la query nel nostro database, dovremmo vedere qualcosa di simile:

datecount
2020-06-297
2020-05-236
2020-06-235
...

Eccellente. Ora sappiamo quante persone hanno visitato il museo in ogni giorno.

Invece di COUNT(*), che significa "conta ogni riga", potremmo anche usare un nome di colonna all'interno, ad esempio COUNT(duration). La differenza è che COUNT(*) conta tutte le righe per un dato gruppo anche se alcune righe contengono valori NULL (sconosciuti). COUNT(duration) duration conta tutte le righe per un determinato gruppo, anche se alcune righe contengono valori NULL (sconosciuti), mentre conta solo le righe che hanno un valore non NULL nella colonna . Nella nostra tabella, tuttavia, non ci sono valori NULL, quindi il risultato sarebbe lo stesso.

Esempio 2: GROUP BY con due colonne

Ora vogliamo conoscere il prezzo medio pagato per un biglietto in un determinato mese. Per questo, avremo bisogno di una query più complicata. Guardate:

SELECT 
  EXTRACT(YEAR FROM date) AS year, 
  EXTRACT(MONTH FROM date) AS month, 
  ROUND(AVG(price), 2) AS avg_price
FROM visit
GROUP BY
  EXTRACT(YEAR FROM date),
  EXTRACT(MONTH FROM date);

Abbiamo usato la funzione EXTRACT(YEAR FROM date) per ottenere l'anno da ogni data e EXTRACT(MONTH FROM date) per ottenere il mese (come valore numerico, dove "1" significa "gennaio", "2" significa "febbraio", ecc.) Si noti che questi dati sono trattati come colonne separate, quindi si vedrà l'anno in una colonna e il mese in un'altra.

Poiché vogliamo vedere la media per ogni mese di ogni anno separatamente, dobbiamo anche raggruppare per queste due colonne. Dobbiamo ripetere le stesse funzioni nella clausola GROUP BY.

La terza colonna è una combinazione di due funzioni. All'interno abbiamo AVG(price), che calcolerà il prezzo medio di ogni gruppo. Abbiamo anche ROUND(AVG(price), 2)) per arrotondare il valore medio a due cifre decimali.

Quando si utilizza una clausola GROUP BY, ricordarsi della regola d'oro: Tutti i nomi delle colonne della clausola SELECT devono comparire nella clausola GROUP BY o essere utilizzati nelle funzioni aggregate. In questo caso, sia EXTRACT(YEAR FROM date) che EXTRACT(MONTH FROM date) devono comparire nella clausola GROUP BY. Se ci si dimentica di una di esse, probabilmente verrà visualizzato un errore. La terza colonna utilizza una funzione aggregata, AVG(price), quindi non viene menzionata nella clausola GROUP BY.
Esistono alcune eccezioni a questa regola, che possono portare a un comportamento inaspettato.

Quando si esegue la query, si vedrà qualcosa di simile a questo:

yearmonthavg_price
202057.52
202066.70

Come si può notare, il prezzo medio dei biglietti è diminuito a giugno rispetto a maggio. Questo potrebbe tradursi in una diminuzione delle entrate per il museo.

Esempio 3: GROUP BY e ORDER BY

Questa volta vogliamo trovare il valore medio della durata della visita per ogni mese. Vogliamo anche assicurarci che le righe siano ordinate cronologicamente. La query di cui avremo bisogno sarà simile a quella dell'esempio precedente:

SELECT 
  EXTRACT(YEAR FROM date) AS year, 
  EXTRACT(MONTH FROM date) AS month, 
  ROUND(AVG(duration), 2)
FROM visit
GROUP BY 
  EXTRACT(YEAR FROM date), 
  EXTRACT(MONTH FROM date)
ORDER BY 
  EXTRACT(YEAR FROM date), 
  EXTRACT(MONTH FROM date);

Il nuovo elemento è la clausola ORDER BY. La clausola ORDER BY consente di specificare l'ordine in cui visualizzare le righe. In questo caso, vogliamo vedere tutte le righe ordinate prima per anno e poi per mese.

Anche in questo caso, è necessario ripetere le stesse funzioni della clausola SELECT perché la clausola ORDER BY funzioni. Per impostazione predefinita, ORDER BY ordina le righe in ordine crescente.

Se si desidera vedere le righe ordinate in ordine decrescente, è necessario aggiungere la parola chiave DESC dopo il nome della colonna. Ad esempio, scrivere ORDER BY EXTRACT(YEAR FROM date) DESC. Per ulteriori informazioni sulla differenza tra GROUP BY e ORDER BY, consultare questo articolo.

Quando eseguiamo la query, vedremo qualcosa di simile a questo:

yearmonthavg_duration
2020547.61
2020651.33

In media, un ospite ha trascorso più tempo nel museo a giugno rispetto a maggio. Questa è una buona notizia!

Esempio 4: GROUP BY e HAVING

Ora abbiamo il seguente problema: vogliamo vedere il prezzo medio dei biglietti per ogni giorno. Tuttavia, c'è una condizione in più: non vogliamo mostrare i giorni con 3 o meno visite. Questa condizione si traduce in un nuovo pezzo della nostra query SQL. Guardate:

SELECT 
  date, 
  ROUND(AVG(price), 2) AS avg_price
FROM visit
GROUP BY date
HAVING COUNT(*) > 3
ORDER BY date;

La nuova parte è HAVING COUNT(*) > 3. HAVING è una clausola che possiamo usare per filtrare le righe raggruppate. In questo caso, raggruppiamo le righe in base alla data (GROUP BY date). In questo caso, vogliamo assicurarci che un determinato gruppo abbia più di tre righe (HAVING COUNT(*) > 3). Se un gruppo (in questo caso, le visite in un determinato giorno) non soddisfa questa condizione, non lo mostriamo affatto.

Quando si esegue la query, si vedrà qualcosa di simile:

dateavg_price
2020-05-015.80
2020-05-157.00
2020-05-236.67
...

Esempio 5: GROUP BY, HAVING e WHERE

Infine, abbiamo il seguente problema da risolvere: vogliamo mostrare la durata media delle visite per ogni giorno. Anche in questo caso, vogliamo mostrare solo i giorni con più di tre visite. Tuttavia, vogliamo anche assicurarci che le visite di durata pari o inferiore a cinque minuti non siano incluse nei calcoli. Si tratta probabilmente di test eseguiti dai dipendenti del museo, quindi vogliamo ignorarli. Questa è la query di cui avremo bisogno:

SELECT 
  date, 
  ROUND(AVG(duration), 2) AS avg_duration
FROM visit
WHERE duration > 5
GROUP BY date
HAVING COUNT(*) > 3
ORDER BY date;

La parte nuova è la clausola WHERE. Viene utilizzata per includere solo le visite che sono durate più di cinque minuti.

Le clausole WHERE e HAVING possono sembrare simili, ma c'è una differenza tra loro: WHERE è usata per filtrare singole righe prima che vengano raggruppate (cioè, singole visite), mentre HAVING è usata per filtrare gruppi di righe (cioè, visite in un determinato giorno). Per saperne di più , leggete questo articolo.

Quando eseguiamo la query, vedremo qualcosa di simile a questo:

dateavg_duration
2020-05-0129.80
2020-05-1555.75
2020-05-2332.17
2020-05-2969.50
2020-06-0239.83
2020-06-0448.67
2020-06-0948.50
2020-06-2351.60
2020-06-2957.86

Si noti come la durata media delle visite aumenti quasi ogni giorno di giugno. Sembra che abbiamo aggiunto una mostra interessante e che i nostri ospiti ne abbiano sparso la voce.

Riepilogo e follow-up

Con questi cinque esempi, siamo passati da casi facili a casi più complessi di GROUP BY. La versatilità di SQL ci ha permesso di analizzare le visite al museo e di rispondere a diverse domande su di esse. Questo dimostra l'efficacia con cui GROUP BY può risolvere problemi aziendali reali.

Se volete saperne di più sulla clausola GROUP BY, il nostro Chief Content Editor, Agnieszka, ha preparato un articolo completo disponibile qui.

Se avete voglia di imparare di più su SQL, date un'occhiata a LearnSQL.it. LearnSQL.it insegna SQL da zero in modo completamente interattivo.

Per i principianti, abbiamo il nostro corso SQL Basics , il più venduto. Garantiamo un ingresso agevole nel mondo del coding anche a chi non ha alcuna esperienza precedente nel campo dell'informatica. Non dovrete preoccuparvi della configurazione tecnica: potrete studiare direttamente dal vostro browser web. Noi ci occupiamo del database, mentre voi vi concentrate sui concetti chiave di SQL.

Se volete saperne di più sui vantaggi di imparare con noi prima di acquistare un abbonamento, date un'occhiata al nostro articolo: Perché seguire il corso SQL Basics di LearnSQL.com. Questo articolo spiega in dettaglio perché abbiamo creato il corso, cosa contiene e la filosofia che lo anima.