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

Panoramica delle funzioni aggregate in SQL

Le funzioni aggregate sono comunemente utilizzate in SQL. Questo articolo vi guiderà nel loro utilizzo e mostrerà esempi di funzionamento.

Le funzioni aggregate di SQL sono uno strumento utile, soprattutto per la creazione di report. Non sono difficili da capire, soprattutto se si ha un po' di esperienza con Excel o programmi simili. Probabilmente avete usato funzioni aggregate come SOMMA o MEDIA in un foglio di calcolo. Anche se le usate solo occasionalmente, conoscere le funzioni aggregate può aiutarvi a capire meglio i vostri dati e a lavorare in modo più efficiente.

Tutto ciò che tratterò in questo articolo è spiegato in modo più dettagliato nel nostro corso Creating Basic SQL Reports , dove potrete anche mettere in pratica tutte le funzioni che imparerete qui.

Cosa sono le funzioni aggregate di SQL?

In SQL, le funzioni aggregate eseguono un calcolo su più righe e restituiscono un unico valore. Vengono spesso utilizzate nell'istruzione GROUP BY, ma possono essere usate anche senza. In SQL esistono cinque funzioni aggregate:

  • COUNT()
  • SUM()
  • AVG()
  • MIN()
  • MAX()

Non spiegherò qui l'istruzione GROUP BY. Non ce n'è bisogno, perché abbiamo già un ottimo articolo su come funziona GROUP BY. Se non avete familiarità con il GROUP BY, vi suggerisco di leggere quell'articolo e poi di tornare qui.

Che cosa fa ogni funzione aggregata?

I nomi delle funzioni di cui sopra sono autoesplicativi, almeno secondo me. Forse avete già capito cosa fanno semplicemente guardandole. Tuttavia, una breve spiegazione non guasta:

FunctionExplanationIgnores NULL values
COUNT()Counts the number of rows in a table
SUM()Calculates the sum of column values
AVG()Calculates the average column value
MIN()Returns the minimum value from a set of values
MAX()Returns the maximum value from a set of values

La tabella delle vendite

Per mostrare il funzionamento delle funzioni aggregate utilizzerò una sola tabella. Si chiama sales ed è composta dai seguenti attributi:

  • id - L'ID del venditore.
  • first_name - Il nome del venditore.
  • last_name - Il cognome del venditore.
  • items_sold - Il numero di articoli venduti.
  • product - Il nome del prodotto venduto.
  • date - La data della vendita.

Ecco alcune righe per mostrare l'aspetto dei dati:

idfirst_namelast_nameitems_soldproductdate
1FrankCoyle42.00Product 12020-12-01
2FrankCoyle81.00Product 22020-12-01
3FrankCoyle14.00Product 32020-12-01
4NatashaHorvat69.00Product 12020-12-01
5NatashaHorvat44.00Product 22020-12-01

Si noti che un venditore può comparire in più righe. Lo stesso vale per il prodotto e la data. Ciò significa che un venditore può vendere più prodotti in più date. Significa anche che in una data lo stesso prodotto può essere venduto da diversi venditori. Questo è importante da ricordare per gli esempi che seguiranno.

Uso di COUNT()

Abbiamo già imparato che questa funzione serve a contare le righe di una tabella. Quindi, contiamole!

COUNT() senza GROUP BY

Innanzitutto, contiamo il numero di righe della tabella. sales tabella. Ecco il codice:

SELECT COUNT (id) AS number_of_columns
FROM sales;

Questo codice utilizza la funzione COUNT() per contare il numero di righe nella colonna id. Se si conta il numero di righe in questa colonna, si ottiene anche il numero totale di righe nella tabella. L'esecuzione del codice restituisce i risultati nella colonna number_of_columns. Ci sono 27 righe:

number_of_columns
27

Si spera che non abbiate problemi con questa semplice istruzione SELECT. In tal caso, il corso SQL Basics può essere utile. Vi insegnerà i principi fondamentali dei database, dell'aggregazione e delle query su una o più tabelle.

COUNT() con GROUP BY

Il prossimo compito è quello di contare il numero di prodotti diversi venduti da ciascun venditore. Pensate a come vengono presentati i dati nella tabella sales. Dopo aver considerato questo aspetto, il codice dovrebbe assomigliare a questo:

SELECT	first_name,
		last_name,
		COUNT (DISTINCT product) AS number_of_products
FROM sales
GROUP BY first_name, last_name;

La query seleziona innanzitutto il nome e il cognome del venditore. Quindi utilizza la funzione COUNT() per contare il numero di prodotti, con il risultato mostrato nella colonna number_of_products.

Si noti la presenza della clausola DISTINCT. Ciò significa che il codice conterà solo i prodotti distinti, ossia conterà un prodotto specifico solo la prima volta che appare per un determinato venditore. La clausola DISTINCT è essenziale in questa query perché lo stesso prodotto può apparire più volte in date diverse. Altrimenti, la funzione COUNT() conterebbe un prodotto ogni volta che appare nella tabella, il che non è il risultato desiderato.

Infine, il risultato del codice è raggruppato per le colonne first_name e last_name perché voglio vedere il risultato per ogni venditore. Ecco il risultato:

first_namelast_namenumber_of_products
FrankCoyle3
NatashaHorvat3
YolandaMartinez3

Ci sono tre venditori e ognuno di loro vende tre prodotti diversi.

La funzione COUNT() è interessante perché ignora i valori NULL. A causa di questa caratteristica, è necessario fare attenzione quando si decide cosa contare e come. Ecco un articolo che illustra le sfumature della funzione COUNT(). Può essere d'aiuto per queste decisioni.

Se volete rafforzare la vostra conoscenza dell'istruzione GROUP BY, provate il nostro corso Creating Basic SQL Reports come esercitazione per GROUP BY. In questo corso, GROUP BY viene spiegato in dettaglio, il che potrebbe essere utile.

SUM() senza GROUP BY

Dopo aver contato le righe, è il momento di imparare a sommare tutti i valori di una tabella. Questa volta il vostro compito è quello di ottenere il numero totale di articoli venduti. Avete già un'idea di come farlo? Non abbiate fretta, prendetevi il tempo necessario prima di dare un'occhiata alla mia soluzione.

Ok, confido che abbiate preso tempo; ecco il codice:

SELECT SUM(items_sold) AS total_items_sold
FROM sales;

Questa semplice query somma la colonna items_sold dalla tabella sales. Il risultato verrà visualizzato nella colonna total_items_sold; eccolo:

total_items_sold
1275.00

SOMMA() con GRUPPO BY

Ora che conoscete la funzione SUM(), complichiamo un po' le cose. Che ne dite di rendere tutti felici e di calcolare il numero di articoli venduti per prodotto? Ecco come fare:

SELECT	product,
		SUM(items_sold) AS items_sold_per_product
FROM sales
GROUP BY product;

Questo codice seleziona la colonna prodotto dalla tabella sales. Poi somma il numero di articoli venduti e mostra il risultato nella colonna items_sold_per_product. Poiché il vostro compito è quello di mostrare il numero di articoli per prodotto, dovrete raggruppare il risultato per prodotto. Voilà, il risultato è:

productitems_sold_per_product
Product 1442.00
Product 2639.00
Product 3194.00

Se siete interessati a controllare il risultato, sommate tutti i valori sopra riportati e otterrete 1.275. Questa somma è esattamente il risultato ottenuto nell'esempio precedente.

Ora vi mostrerò cosa fa la funzione AVG().

AVG() senza GROUP BY

Come già sapete, la funzione AVG() calcola il valore medio di un insieme di valori. Per mostrarvi come funziona, immaginiamo di dover calcolare il numero medio di articoli venduti. Ecco una query che fornirà il risultato corretto:

SELECT AVG(items_sold) AS avg_number_of_items_sold
FROM sales;

Questo codice è simile all'esempio della funzione SUM(). Ora utilizza la funzione AVG() per calcolare i valori medi nella colonna items_sold. Il risultato del codice apparirà nella colonna avg_number_of_items_sold.

Il piccolo codice restituisce una piccola tabella:

avg_number_of_items_sold
47.222222

Fate attenzione quando utilizzate AVG() su una colonna con valori NULL. Questa funzione non tiene conto delle righe che contengono i valori NULL, quindi il valore medio potrebbe essere diverso da quello previsto. Lasciate che vi mostri cosa intendo. Ho modificato la tabella sales per mostrare come funziona:

idfirst_namelast_nameitems_soldproductdate
1FrankCoyle42Product 12020-12-01
2FrankCoyle81Product 22020-12-01
3FrankCoyle14Product 32020-12-01
4NatashaHorvatNULLProduct 12020-12-01

Quale pensate che sarà il valore medio di items_sold? La vostra intuizione dice che la funzione AVG() tratterebbe il valore NULL come zero? Qualcosa del genere:

AVG = (42+81+14+0)/4 = 34.25

No, la vostra intuizione è sbagliata! Ignorare i valori NULL significa trattare la riga come se non esistesse affatto. In questo modo:

AVG = (42+81+14)/3 = 45.67

AVG() con GROUP BY

Questa volta, avete bisogno di un report che mostri la media degli articoli venduti per data. Come si può fare utilizzando la funzione AVG() con GROUP BY? Probabilmente l'avrete capito da soli. In caso contrario, ecco la soluzione:

SELECT	date,
		AVG(items_sold) AS avg_items_per_date
FROM sales
GROUP BY date;

Questa query seleziona la colonna data dalla tabella sales. Di nuovo, viene calcolata la media degli articoli venduti e il risultato viene mostrato nella colonna avg_items_per_date. Si vuole che il risultato sia visualizzato per data, quindi è necessario raggruppare il risultato per la colonna date.

dateavg_items_per_date
2020-12-0147
2020-12-0259
2020-12-0335.666666

Tre funzioni aggregate eliminate, ne mancano due. Vediamo ora le funzioni MIN() e MAX(). Si può quasi pensare che siano un'unica funzione.

MIN() e MAX() senza GROUP BY

Le funzioni MIN() e MAX() possono essere viste come i poli opposti di una funzione. Funzionano allo stesso modo, solo che una funzione restituisce il valore minimo e l'altra il valore massimo in un insieme di valori.

Per mostrare il funzionamento di queste due funzioni, mostriamo il numero minimo e massimo di articoli venduti in un giorno. Come si fa? Poiché i dati della tabella sales sono a livello di data, è semplice:

SELECT	MIN(items_sold) AS min_daily_sale,
		MAX(items_sold) AS max_daily_sale
FROM sales;

Il codice utilizza prima la funzione MIN() sulla colonna items_sold per trovare il valore più piccolo. Il risultato apparirà nella colonna min_daily_sale. La funzione MAX() trova il valore più grande e il risultato viene visualizzato nella colonna max_daily_sale. Eseguite il codice e questo è il risultato che otterrete:

min_daily_salemax_daily_sale
7.00122.00

MIN() e MAX() con GROUP BY

Nell'esempio precedente, non otteniamo altro che i valori di vendita giornalieri più piccoli e più grandi. Non sappiamo nient'altro oltre a questo. Per rendere più interessante questo report, mostriamo il minimo e il massimo degli articoli venduti per commesso e per prodotto. Siete pronti a vedere la soluzione? Eccola:

SELECT	first_name,
		last_name,
		product,
		MIN(items_sold) AS min_sold_per_product,
		MAX(items_sold) AS max_sold_per_product
FROM sales
GROUP BY first_name, last_name, product;

La vostra ultima domanda per oggi merita di essere la più lunga. Non lasciatevi spaventare: non c'è nulla che non sappiate già. La query seleziona le colonne first_name, last_name e il prodotto dalla tabella sales. Quindi viene utilizzata la funzione MIN() per calcolare il minor numero di articoli venduti per prodotto; il risultato viene mostrato nella colonna min_sold_per_product. Poi c'è il maggior numero di articoli venduti per prodotto nella colonna max_sold_per_product. Infine, il risultato deve essere raggruppato in base al nome e al cognome dei venditori e al nome del prodotto. Ecco il rapporto:

first_namelast_nameproductmin_sold_per_productmax_sold_per_product
FrankCoyleProduct 121.0066.00
FrankCoyleProduct 267.0099.00
FrankCoyleProduct 314.0025.00
NatashaHorvatProduct 112.0069.00
NatashaHorvatProduct 244.00122.00
NatashaHorvatProduct 324.0031.00
YolandaMartinezProduct 128.00112.00
YolandaMartinezProduct 230.0067.00
YolandaMartinezProduct 37.0033.00

Come promesso, questo è il vostro ultimo compito! Ora la cosa migliore da fare è esercitarsi da soli con le funzioni aggregate di SQL. Magari provate il nostro SQL Practice Setche contiene una bella sezione su GROUP BY. Oppure date un'occhiata a un altro articolo, che fornisce cinque esempi di GROUP BY; forse è proprio quello che vi serve.

Trovate utili le funzioni aggregate di SQL?

La lettura di questo articolo non è l'unica cosa di cui avete bisogno per essere esperti di funzioni aggregate. Tuttavia, ho cercato di fornire una panoramica pratica delle funzioni aggregate di SQL: cosa fanno e come lo fanno. Ho anche mostrato come utilizzare le funzioni aggregate con e senza GROUP BY. Ora potrebbe essere un buon momento per approfondire l'argomento GROUP BY, considerando l'utilità che GROUP BY e le sue estensioni possono avere nel mondo del lavoro.

Sentitevi liberi di condividere la vostra esperienza con le funzioni aggregate di SQL nella sezione commenti.