27th Jul 2023 Tempo di lettura: 10 minuti Come utilizzare COUNT() con GROUP BY: 5 esempi pratici Radu Gheorghiu sql group by Indice Come usare COUNT() e GROUP BY Quando usare GROUP BY Quando utilizzare la funzione COUNT() 5 esempi di utilizzo di COUNT() con GROUP BY Esempio n. 1: GROUP BY UNA SINGOLA COLONNA Esempio n. 2: GROUP BY COLONNE MULTIPLE Esempio n. 3: Utilizzo di WHERE con COUNT() e GROUP BY Esempio 4: Utilizzo di ORDER BY con COUNT() e GROUP BY Esempio #5: COUNT(espressione) COUNT(*) - Conteggio delle righe Conteggio dei valori NON NULL in una colonna Conteggio di valori distinti NON NULL in una colonna Volete saperne di più su COUNT() e GROUP BY? 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: Per prima cosa, il database esegue una scansione della tabella orders e legge tutte le righe. 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. Le righe filtrate vengono quindi raggruppate in base ai valori delle colonne CustomerID e ProductCategory, specificati nella clausola GROUP BY. 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. 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. Tags: sql group by