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

Come utilizzare COUNT() con GROUP BY: 5 esempi pratici

L'uso della funzione COUNT() con GROUP BY è uno dei costrutti SQL più comuni nelle query aggregate. Leggete questo articolo per scoprire come utilizzare correttamente la funzione COUNT() con GROUP BY con 5 esempi.

In questo articolo spiegheremo l'importanza dell'uso di COUNT con GROUP BY. Parleremo del perché è essenziale in SQL e di come consente l'analisi e la sintesi dei dati in base a criteri specifici. Questa combinazione consente agli utenti di estrarre informazioni significative, calcolare conteggi e generare riepiloghi statistici da grandi insiemi di dati.

Se siete alla ricerca di un ripasso approfondito dei concetti di base di SQL, come COUNT() e GROUP BY, vi consiglio il nostro corso interattivo SQL Basics interattivo. Contiene 129 esercizi che vi aiuteranno a rivedere tutti i concetti chiave di SQL.

Come usare COUNT() e GROUP BY

Se siete qui solo per avere una risposta rapida, ecco il testo completo:

Il modo corretto di usare COUNT() con GROUP BY è mostrato nella query qui sotto:

SELECT 
  Store,
  COUNT(*) as NumberOfSales, 
FROM Sales
GROUP BY Store;

Analizziamo il risultato per capire come funziona questa query. Le righe con lo stesso valore nella colonna Store vengono raggruppate. Immaginate una tabella intermedia in cui queste righe sono raggruppate e contrassegnate da colori diversi, come nell'immagine sottostante. Questa sarebbe la nostra tabella intermedia contenente solo la colonna Store, poiché è la colonna che fa parte della nostra istruzione SELECT.

StoreProductIDCustomerID
Store A1657
Store A11116
Store A14525
Store B1369
Store B11138
Store C13616
Store C1118

Il database conta quindi logicamente il numero di righe in ciascun gruppo utilizzando la funzione COUNT(*). Questo conteggio rappresenta il numero di ordini per ogni negozio.

Una volta contate le righe, non è più necessario avere righe duplicate con lo stesso valore di Store. Pertanto, GROUP BY ridurrà il numero di righe ai soli valori univoci. In altre parole, eliminerà le singole righe e fornirà un riepilogo di ciascun gruppo. Il risultato finale è il seguente:

StoreNumberOfSales
Store A3
Store B2
Store C2

Quando usare GROUP BY

GROUP BY è una clausola SQL che raggruppa le righe in base ai valori di una o più colonne. Viene spesso utilizzata in combinazione con funzioni aggregate come COUNT(), SUM(), AVG(), MAX() e MIN() per eseguire calcoli su dati raggruppati.

La clausola GROUP BY è utile quando si desidera:

  • Eseguire calcoli e aggregazioni su sottoinsiemi di dati.
  • Generare statistiche e metriche di riepilogo per diversi gruppi o categorie.
  • Identificare modelli e tendenze all'interno di gruppi specifici.
  • Generare report e analizzare i dati in base a diverse dimensioni o attributi.
  • Applicare filtri e condizioni ai dati raggruppati, utilizzando il metodo HAVING.

In sintesi, GROUP BY viene utilizzato per organizzare e riassumere i dati in base a colonne, funzioni o espressioni specifiche, che consentono di ottenere approfondimenti e di eseguire calcoli su gruppi distinti all'interno di un set di dati.

Quando utilizzare la funzione COUNT()

COUNT() è una delle funzioni aggregate più comuni di SQL. Restituisce il numero di righe che corrispondono a una condizione specificata o che sono incluse in un set di risultati. Viene spesso utilizzata per recuperare il numero totale di record in una tabella o per calcolare il numero di occorrenze di un particolare valore in una colonna.

5 esempi di utilizzo di COUNT() con GROUP BY

Dopo aver esaminato gli scenari di base in cui vengono utilizzati COUNT() e GROUP BY, esaminiamo alcuni esempi più complicati. Inizieremo con esempi più semplici per arrivare a scenari più complessi.

Esempio n. 1: GROUP BY UNA SINGOLA COLONNA

Lo scenario più semplice che si può incontrare è quello in cui è necessario effettuare un raggruppamento per una singola colonna. Nell'esempio seguente, dobbiamo scoprire come il numero di dipendenti della nostra azienda è distribuito tra i diversi titoli di lavoro.

Prima di vedere la soluzione SQL per questo scenario, esaminiamo i dati di esempio. Questa è la employees tabella:

EmployeeIDFirstNameLastNameJobTitle
1JohnDoeManager
2JaneSmithSupervisor
3MarkJohnsonDeveloper
4EmilyWilliamsAnalyst
5MichaelBrownDesigner
6SarahDavisDeveloper
7RobertWilsonDesigner
8JessicaTaylorDeveloper

Utilizzando la funzione COUNT con GROUP BY sulla colonna JobTitle, possiamo ottenere una ripartizione del numero di dipendenti in ogni ruolo specifico. Di seguito è possibile vedere la query e il risultato (basato sui dati di esempio):

SELECT 
  JobTitle, 
  COUNT(*) AS NumberOfEmployees
FROM employees
GROUP BY JobTitle;
JobTitleNumberOfEmployees
Analyst1
Designer2
Developer3
Manager1
Supervisor1

Questo esempio funziona come la nostra query iniziale. GROUP BY mette in un unico gruppo le righe dei dipendenti con lo stesso titolo di lavoro. La funzione COUNT() conta le righe di ciascun gruppo. GROUP BY comprime quindi le righe di ciascun gruppo, mantenendo solo il valore della colonna JobTitle e il conteggio.

Esempio n. 2: GROUP BY COLONNE MULTIPLE

Naturalmente, è possibile raggruppare le righe in base a più colonne.

In questo esempio, esamineremo una tabella di esempio orders contenente informazioni di base sugli ordini:

OrderIDCustomerIDProductIDProductCategoryOrderDateStatusAmount
11011001Electronics2023-05-01Completed150.00
21021002Clothing2023-05-02Completed80.00
31011001Home Goods2023-06-03In progress60.00
4103NULLAccessories2023-06-03Canceled200.00
51011002Electronics2023-07-04NULL120.00
61021001NULL2023-07-05NULLNULL
71031002Clothing2023-07-06In progress90.00
81021002Accessories2023-08-07NULL75.00
9103NULLNULL2023-08-08NULL100.00
101011001Home Goods2023-09-09NULLNULL
111021001Home Goods2023-06-05In progress80.00
121031004Accessories2023-06-06Completed75.00
131021005Electronics2023-08-06Completed88.00

Dobbiamo scrivere una query che mostri il numero di ordini effettuati da ciascun cliente e l'indirizzo ProductCategory di tale ordine. Ciò significa che dovremo restituire il CustomerID e la categoria in cui rientra l'ordine.

La query avrà questo aspetto:

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
GROUP BY CustomerID, ProductCategory;

Il risultato dell'esecuzione di questa query è visibile qui sotto:

CustomerIDProductCategoryNumberOfOrders
101Electronics2
101Home Goods2
102Electronics2
102Accessories2
102Clothing1
103Accessories2
103Clothing1
103NULL1

La nostra query raggruppa le righe in base a due colonne: CustomerID e ProductCategory. Ciò significa che GROUP BY raggruppa le righe con gli stessi valori di CustomerID e ProductCategory in un unico gruppo. (Le righe per CustomerID 101 e la categoria Electronics sono in un gruppo, ma le righe per CustomerID 101 e la categoria Home Goods sono in un gruppo diverso). Quindi le righe di ciascun gruppo vengono contate da COUNT().

Esempio n. 3: Utilizzo di WHERE con COUNT() e GROUP BY

L'esempio precedente analizzava uno scenario in cui si voleva creare un aggregato di tutte le informazioni presenti nella tabella. orders tabella. A volte, però, si potrebbe desiderare di analizzare queste informazioni e vedere solo gli ordini relativi a categorie selezionate.

Utilizzando gli stessi dati di esempio di prima, scriveremo ora una query che mostri le stesse informazioni per gli ordini che rientrano in "Accessori" o "Abbigliamento" ProductCategory.

A tale scopo, possiamo utilizzare la query dell'Esempio 2 e aggiungere una clausola WHERE. Questa clausola filtrerà i record in cui ProductCategory è uguale a "Accessori" o "Abbigliamento".

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
WHERE ProductCategory IN (‘Accessories’, ‘Clothing’)
GROUP BY CustomerID, ProductCategory;
CustomerIDProductCategoryNumberOfOrders
102Accessories2
103Accessories1
102Clothing1
103Clothing1

Se non è del tutto intuitivo come il database abbia generato i risultati utilizzando la query di cui sopra, ecco una spiegazione passo passo di ciò che è avvenuto dietro le quinte:

  1. Per prima cosa, il database esegue una scansione della tabella orders e legge tutte le righe.
  2. Quindi applica la condizione di filtraggio in WHERE ProductCategory IN (‘Accessories’, ‘Clothing’ ) per filtrare le righe. Dopo questa fase, solo le righe in cui la categoria del prodotto è "Accessori" o "Abbigliamento" vengono considerate per un'ulteriore elaborazione.
  3. Le righe filtrate vengono quindi raggruppate in base ai valori delle colonne CustomerID e ProductCategory, specificati nella clausola GROUP BY.
  4. Per ciascuna delle combinazioni uniche di CustomerID e ProductCategory, viene applicata la funzione COUNT(*). Questo conterà il numero di righe all'interno di ciascun gruppo.
  5. Il risultato finale include i dati CustomerID, ProductCategory e il conteggio degli ordini (indicato nella colonna NumberOfOrders ) per ciascun gruppo.

In sintesi, il database filtra le righe che rispettano la condizione di filtraggio specificata. Quindi le raggruppa in base alle colonne specificate nella clausola GROUP BY e calcola il conteggio degli ordini all'interno di ciascuno di questi gruppi. L'output finale includerà CustomerID, ProductCategory e il corrispondente conteggio degli ordini per ogni combinazione unica di CustomerID e ProductCategory.

Esempio 4: Utilizzo di ORDER BY con COUNT() e GROUP BY

Osservando il risultato dell'esempio numero 4, si può notare che alcune righe dell'output sono miste. Ciò è dovuto al fatto che le colonne dell'elenco GROUP BY generalmente richiedono - ma non garantiscono - un ordinamento dell'output basato sull'elenco di colonne della sezione GROUP BY.

Ma se, ad esempio, abbiamo bisogno di organizzare i risultati in base a condizioni diverse (ad esempio una linea temporale o una data), dovremo usare una clausola ORDER BY:

SELECT
  CustomerID,
  ProductCategory,
  COUNT(*) AS NumberOfOrders
FROM orders
WHERE ProductCategory IN (‘Accessories’, ‘Electronics’)
GROUP BY CustomerID, ProductCategory
ORDER BY ProductCategory, CustomerID;
CustomerIDProductCategoryNumberOfOrdes
101Accessories2
102Accessories2
102Electronics1
103Electronics2

Abbiamo aggiunto la clausola ORDER BY con l'elenco delle colonne per cui vogliamo ordinare i dati. Come si può vedere, questo ordina le informazioni in uscita in base all'ordine delle colonne elencate.

Esempio #5: COUNT(espressione)

Finora abbiamo visto semplici esempi di lavoro con COUNT(); lo scopo era contare tutte le righe nel dataset o nella tabella di origine.

Tuttavia, esistono modi più complessi per utilizzare la combinazione COUNT–GROUP BY. Per spiegarlo, costruiremo un nuovo set di dati di esempio.

Abbiamo una tabella chiamata SurveyResponses che memorizza le risposte a un sondaggio. Alcune delle domande sono facoltative, per cui ci sono alcuni rispondenti con valori di risposta NULL; hanno saltato le domande facoltative. Si possono vedere i dati di esempio qui sotto:

ResponseIDRespondentIDRespondentNameQuestionIDAnswer
1101John1Agree
2101John2No
3101John3Yes
4102Sarah1Yes
5102Sarah2Not Sure
6102Sarah3NULL
7103Mark1No
8103Mark2Maybe
9103Mark3No
10104Emily1Yes
11104Emily2Not Sure
12104Emily3Disagree

COUNT(*) - Conteggio delle righe

L'uso più comune della funzione COUNT (e la sua funzionalità predefinita, anche se viene utilizzata con GROUP BY) è il conteggio del numero di righe. Per esempio, se si vogliono contare i tipi di risposta delle domande di un sondaggio, si può usare la seguente query:

SELECT COUNT(*) AS NumberOfYesAnswers, Answer
FROM SurveyResponses
GROUP BY Answer;

L'output sarà simile a questo:

NumberOfAnswersAnswer
3Yes
3No
2Not Sure
1Agree
1Disagree
1Maybe
1NULL

Il risultato è un conteggio di tutte le righe che corrispondono a una determinata risposta. Restituisce il numero aggregato di risposte all'indagine e il tipo di risposta.

Conteggio dei valori NON NULL in una colonna

Vediamo un altro esempio che potrebbe sembrare generare gli stessi risultati. In realtà, questo esempio ha qualcosa di particolare e importante: invece di usare * come parametro della funzione COUNT(), usiamo COUNT() con il nome della colonna.

Modifichiamo la query dell'esempio precedente. Al posto del parametro * per la funzione COUNT(), lo sostituiremo con la colonna Answer. La nuova query si presenta così:

SELECT 
  COUNT(Answer) AS NumberOfAnswers, 
  AnswerFROM SurveyResponses
GROUP BY Answer;

Se eseguiamo questa nuova query, vedremo che i risultati restituiti sono quasi esattamente gli stessi:

NumberOfAnswersAnswer
3Yes
3No
2Not Sure
1Agree
1Disagree
1Maybe
0NULL

Si può notare che l'output per il valore della risposta NULL è cambiato da 1 a 0. Questo perché la funzione COUNT() prende in considerazione solo i valori nonNULL quando esegue l'aggregazione.

Prima facevamo COUNT(*), che implicitamente significava contare le righe; COUNT(Answer) conterà i valori nella colonna Answer. E poiché con NULL avevamo 1 valore, salterà quei valori nel suo calcolo, restituendo 0 in questo secondo scenario.

Conteggio di valori distinti NON NULL in una colonna

In questa terza variante dell'uso della funzione COUNT, utilizzeremo la stessa query dell'esempio precedente. Questa volta, però, aggiungeremo la parola chiave DISTINCT prima del nome della colonna.

SELECT 
  Answer, 
  COUNT(DISTINCT Answer) AS DistinctCount
FROM SurveyResponses
GROUP BY Answer;
StatusDistinctCount
Yes1
No1
Not Sure1
Agree1
Disagree1
Maybe1
NULL0

Nell'output sopra riportato si può notare che il risultato di questa query ha portato a 1 tutti i valori positivi della colonna DistinctCount. L'aggiunta della parola chiave DISTINCT significa che ogni volta che la funzione COUNT trova un nuovo valore che non ha mai visto prima, aggiungerà quello stato al suo elenco e aggiungerà un 1 al suo conteggio. Tuttavia, se trova lo stesso valore di stato una seconda volta o più, non lo conterà.

Volete saperne di più su COUNT() e GROUP BY?

L'uso di COUNT() con GROUP BY è solo una delle tante potenti funzioni offerte da SQL. Se siete desiderosi di esplorare ulteriormente SQL e di padroneggiarne davvero le capacità, vi invito a consultare il nostro corso completo SQL per principianti. Se siete alla ricerca di esercitazioni su SQL, vi consiglio di consultare il nostro Pratica su SQL che contiene oltre 600 esercizi pratici su SQL.

Dopo aver seguito i nostri corsi, forse vi è venuta voglia di trovare un lavoro con SQL. Per aiutarvi a prepararvi al colloquio, vi proponiamo un elenco di domande per colloqui SQL che vi mostreranno alcuni esempi reali di domande e problemi in SQL.