21st Jul 2022 Tempo di lettura: 6 minuti Utilizzo di GROUP BY in SQL Zahin Rahman sql imparare sql group by Indice Sintassi GROUP BY GRUPPO PER UNA SINGOLA COLONNA Raggruppamento con le funzioni aggregate MAX(), MIN(), AVG(), SUM() GRUPPO PER COLONNE MULTIPLE con COUNT() Padroneggiare SQL GROUP BY Ora che conoscete i comandi principali di SQL, potenziate le vostre query con la clausola GROUP BY e le funzioni aggregate. GROUP BY è una clausola SQL che organizza i dati in gruppi basati su uno o più valori comuni. È molto utilizzata per ottenere informazioni di riepilogo su grandi insiemi di dati e per calcolare statistiche aggregate di base. Una volta acquisiti i comandi di base di SQL, come SELECT, WHERE e JOIN, la padronanza della clausola GROUP BY può aiutare a implementare le conoscenze di SQL in scenari di business intelligence reali. La clausola SQL GROUP BY viene usata più spesso in combinazione con funzioni aggregate come COUNT(), MAX(), MIN(), SUM() e AVG(). Raggruppa il set di risultati in base a una o più colonne, creando essenzialmente righe di riepilogo per ogni gruppo. Questi gruppi sono solitamente basati su valori categorici piuttosto che continui. Ad esempio, se si utilizza un set di dati di clienti globali per la propria azienda, è possibile utilizzare la clausola GROUP BY per riassumere informazioni quali il "numero totale di clienti per ciascun paese" o le "vendite totali per cliente". Sintassi GROUP BY Ora che sappiamo cos'è la clausola GROUP BY, vediamo la sintassi di una query GROUP BY di base. SELECT column_name(s) FROM table_name WHERE [condition] GROUP BY column_name1, column_name2 HAVING [condition] ORDER BY column_name Ecco: SELECT è la query SQL standard SELECT. GROUP BY column_name1 esegue il raggruppamento in base ai valori in column_name1. column_name2 si usa quando il raggruppamento viene fatto su più di una colonna; si può raggruppare per qualsiasi numero di colonne. È opzionale. HAVING [condition] e WHERE [condition] sono anch'esse facoltative; entrambe vengono utilizzate per limitare le righe interessate dalla clausola GROUP BY. La differenza fondamentale è che WHERE filtra le righe prima del raggruppamento, mentre HAVING filtra i gruppi stessi una volta formati. Importante: WHERE deve precedere la clausola GROUP BY e HAVING deve seguirla. ORDER BY [condition] viene utilizzato dopo GROUP BY per ordinare i dati in base a un dato column_name. A prima vista, GROUP BY e ORDER BY sembrano fare la stessa cosa: ordinare i dati. Ma le loro somiglianze finiscono qui. Come suggerisce il nome, ORDER BY ordina semplicemente l'intero set di dati in un ordine definito, mentre GROUP BY raggruppa i dati come output aggregato. Il nostro precedente articolo, La differenza tra GROUP BY e ORDER BY in parole semplici, lo spiega in modo più dettagliato; consultatelo se avete bisogno di un ripasso. Vediamo ora come funziona la clausola GROUP BY con query reali. GRUPPO PER UNA SINGOLA COLONNA Per comprendere l'effetto della clausola GROUP BY, eseguiamo una semplice query sulla tabella Orders che ha registrato 196 ordini individuali. Di seguito sono riportate le prime cinque voci della tabella: OrderIDCustomerIDEmployeeIDOrderDateShipperID 102489051996-07-043 102498161996-07-051 102503441996-07-082 102518431996-07-081 102527641996-07-092 Utilizzando la tabella Orders scopriamo quanti clienti unici hanno effettuato un ordine. Ecco la query: SELECT CustomerID FROM Orders GROUP BY CustomerID RISULTATO Number of Records: 74 CustomerID 2 3 4 5 7 Questo è un esempio di una semplice clausola GROUP BY su una singola colonna (CustomerID); l'output colloca tutte le righe con lo stesso valore per la colonna CustomerID nello stesso gruppo. Inoltre, restituisce il numero di clienti unici che hanno effettuato un ordine (74). In sostanza, una clausola GROUP BY senza una funzione aggregata si comporta in modo simile a una clausola DISTINCT: trova i valori unici in una colonna. Il raggruppamento può essere fatto anche in base a più colonne. Questo è più utile quando viene utilizzato con le funzioni aggregate. Raggruppamento con le funzioni aggregate L'applicazione pratica del comando GROUP BY di SQL consiste nel riassumere i parametri statistici per gruppi di dati; di solito questo si ottiene con le funzioni aggregate. Esploreremo ora alcuni esempi, utilizzando le tabelle e il comando Orders e la tabella OrderDetails un esempio di tabella è mostrato di seguito: OrderDetailIDOrderIDProductIDQuantity 1102481112 2102484210 310248725 410249149 5102495140 MAX(), MIN(), AVG(), SUM() GROUP BY è perfetta per riassumere i parametri statistici di singole categorie nel vostro set di dati. Ad esempio, cerchiamo di trovare la quantità massima, minima e media di ogni ProductID per ordine e il numero totale di ogni prodotto ordinato. Utilizzeremo la tabella OrderDetails e metteremo i risultati in ordine decrescente in base alla somma delle quantità ordinate per ogni prodotto. In questo modo si potrà capire quali sono i prodotti più popolari di ProductIDs. Ecco la query: SELECT ProductID, MAX(Quantity), Min(Quantity), AVG(Quantity), SUM (Quantity) FROM OrderDetails GROUP BY ProductID Order By SUM(Quantity) DESC RISULTATO Number of Records: 77 ProductIDMAX(Quantity)Min(Quantity)AVG(Quantity)SUM (Quantity) 3170432.714285714285715458 6080635.833333333333336430 35100441369 5970624.714285714285715346 260731341 La tabella seguente illustra come vengono calcolati alcuni di questi valori aggregati per i valori 2 e 31 di ProductID. La clausola GROUP BY raggruppa prima le righe per ProductID 2 e poi calcola AVG() e MAX() per l'intero gruppo. Lo stesso avviene per ogni ProductID per ciascuna delle funzioni aggregate della query. ProductIDQuantityAverage (?Quantity/# of ProductID)Max (Quantity) 2603160 250 245 240 235 ………… 317032.71470 3160 3156 3142 3140 ………… Come si vede, il comando GROUP BY è uno strumento estremamente utile per trovare sommatorie statistiche per qualsiasi classe di variabili. GRUPPO PER COLONNE MULTIPLE con COUNT() Come accennato in precedenza, è possibile utilizzare più colonne nel comando GROUP BY. In altre parole, tutte le righe con gli stessi valori in column_name1 e column_name2 vengono raggruppate in un unico gruppo. Consideriamo un esempio in cui vogliamo contare il numero di volte in cui ogni dipendente ha utilizzato un servizio di spedizione. Ancora una volta, utilizzeremo la tabella Orders tabella. SELECT EmployeeID, ShipperID, COUNT(*) FROM Orders Group BY EmployeeID, ShipperID Order BY ShipperID, Count(*) DESC RISULTATO Number of Records: 26 EmployeeIDShipperIDCOUNT(*) 4112 118 217 317 617 …….…….……. Questa query potrebbe essere utilizzata, ad esempio, per ottenere un feedback sul servizio clienti degli spedizionieri da parte dei dipendenti che hanno utilizzato tale servizio. Come si può vedere, ci sono 26 coppie di interazioni uniche tra dipendenti e spedizionieri! Come funziona il raggruppamento per due colonne dietro le quinte? Le righe con gli stessi EmployeeID e ShipperID vengono raggruppate in un unico gruppo. La dimensione di questi gruppi (cioè il numero di record nel gruppo) viene calcolata, come si può vedere qui sotto: EmployeeIDShipperIDCount 11 11 1112 11 11 …………. 41 41 418 41 41 …………. Il comando GROUP BY è anche un potente strumento che può essere combinato con le clausole SQL HAVING e WHERE per definire condizioni aggiuntive per i risultati restituiti. Si tenga presente che ci sono alcune sottigliezze quando GROUP BY viene utilizzato con colonne che hanno NULL valori. Per ulteriori dettagli si rimanda al nostro precedente articolo sugli errori comuni di GROUP BY . Padroneggiare SQL GROUP BY Inutile dire che solo la pratica vi permetterà di padroneggiare questo comando! La pratica è preferibile farla su insiemi di dati del mondo reale, dove è possibile visualizzare e mettere in relazione con le esigenze aziendali. Il corso SQL Basics corso include una serie completa di esercizi interattivi. Imparerete a raggruppare le righe e a calcolare le statistiche con le funzioni aggregate su insiemi di dati pratici. Provatelo e buona fortuna! Tags: sql imparare sql group by