Il linguaggio di interrogazione T-SQL di SQL Server offre una vasta gamma di opzioni di recupero dati. Questo include la capacità di interrogare un database SQL, nonché di fornire una funzione di somma, una funzione aggregata di conteggio e di raggruppamento delle colonne. La clausola GROUP BY di SQL può sfruttare tutte queste capacità. In questo articolo, ti mostrerò come la clausola GROUP BY può essere utilizzata da sola o in combinazione con una delle funzioni aggregate per eseguire calcoli basati sul raggruppamento.
Come funziona la clausola GROUP BY di SQL?
La clausola GROUP BY di SQL è utilizzata con l’istruzione SELECT per organizzare i dati in gruppi di dati identici. Segue la clausola WHERE in un’istruzione SELECT.
Questa clausola è più spesso utilizzata con funzioni aggregate come SUM, COUNT, AVG, MAX o MIN, che ti consentono di eseguire calcoli con dati raggruppati. Puoi raggruppare i dati per qualsiasi tipo di colonna diverso, inclusi numeri come ID prodotto, date o caratteri come descrizioni.
La sintassi di base di GROUP BY è piuttosto semplice:
SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1;
Qui, puoi vedere la clausola GROUP BY utilizzata con una semplice istruzione SELECT. L’istruzione SELECT recupera due colonne, e la seconda colonna utilizza una funzione di aggregazione.
L’uso di una funzione di aggregazione non è tecnicamente obbligatorio, ma è un ausilio molto comune alla clausola GROUP BY. Il raggruppamento verrà eseguito sui dati contenuti nella prima colonna.
Approfondiamo e vediamo la clausola GROUP BY in azione.
Utilizzo di SQL GROUP BY con un’istruzione SELECT
Prima, vediamo l’uso della clausola SQL GROUP BY con una semplice istruzione SELECT senza aggiungere una funzione di aggregazione. L’elenco seguente recupera e raggruppa la colonna ‘ID Prodotto’ dalla tabella SalesLT.SalesOrderDetail nel database di esempio AdventureWorksLT2019.
USE AdventureWorksLT2019; SELECT ProductID FROM SalesLT.SalesOrderDetail GROUP BY ProductID;
Questo restituisce essenzialmente un elenco di tutti i ProductID che sono stati ordinati, come si può vedere nella figura seguente.

Utilizzo di SQL GROUP BY con funzioni di aggregazione
È più comune utilizzare la clausola GROUP BY SQL insieme a una delle funzioni di aggregazione che possono darti un conteggio, totale, media o riepilogo di tutte le colonne che hai raggruppato insieme. La seguente istruzione utilizza GROUP BY con la tabella SalesLT.Product del database AdventureWorksLT2019 per trovare il numero totale di prodotti in ogni categoria di prodotti:
USE AdventureWorksLT2019; SELECT ProductCategoryID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID;
In questo esempio, l’istruzione SELECT restituisce la colonna ‘ProductCategoryID’ dalla tabella SalesLT.Product e conta il numero di prodotti in ogni categoria utilizzando la funzione di aggregazione COUNT(*). Qui, la clausola GROUP BY raggruppa i risultati per ‘ProductCategoryID’ mentre la funzione di conteggio SELECT calcola il numero totale di prodotti in ogni categoria di prodotti. I risultati della funzione COUNT(*) utilizzano l’alias ‘TotalProducts’.
I risultati di questa query sono mostrati nella seguente figura. Questo output mostra il numero totale di prodotti in ogni categoria di prodotti, calcolato utilizzando la clausola GROUP BY. Le informazioni di riepilogo sono restituite dalla funzione di aggregazione COUNT(*).

Utilizzo di SQL GROUP BY con più colonne
La funzione SQL GROUP BY non è limitata a lavorare con una singola colonna. Può anche essere utilizzata con più colonne contemporaneamente nella stessa query.
Diamo un’occhiata a un esempio di utilizzo della clausola GROUP BY con due colonne della tabella SalesLT.Product nel database AdventureWorksLT2019. La query seguente mostra come recuperare il numero totale di prodotti per ogni categoria di prodotto e modello di prodotto.
USE AdventureWorksLT2019; SELECT ProductCategoryID, ProductModelID, COUNT(*) AS TotalProducts FROM SalesLT.Product GROUP BY ProductCategoryID, ProductModelID;
Qui, le colonne ‘ProductCategoryID’ e ‘ProductModelID’ vengono entrambe recuperate e stiamo utilizzando la funzione di aggregazione COUNT(*) per contare il numero di prodotti in ogni categoria di prodotto e sottocategoria. In questo esempio, la clausola GROUP BY raggruppa i risultati delle colonne ‘ProductCategoryID’ e ‘ProductModelID’. Ciò crea due gruppi distinti basati sulle due colonne diverse.
Puoi vedere i risultati di questa query nella figura seguente. Questi risultati mostrano il numero totale di prodotti e modelli di prodotto e il conteggio totale viene recuperato utilizzando l’alias di colonna TotalProducts.

Utilizzo di SQL GROUP BY con la clausola HAVING
Un altro uso comune della clausola GROUP BY è quello di combinarla con la clausola HAVING. Infatti, puoi utilizzare la clausola GROUP BY con la clausola HAVING per filtrare i risultati di una query in base alle condizioni che la clausola HAVING applica ai raggruppamenti di dati. La condizione può essere applicata a una colonna di tipo di dati regolare o a una funzione di aggregazione.
Diamo un’occhiata a un esempio di utilizzo della clausola SQL GROUP BY insieme alla clausola HAVING con il database AdventureWorksLT2019. Questo esempio mostra quali clienti hanno effettuato ordini nella tabella SalesLT.SalesOrderHeader con un importo totale dell’ordine superiore a $2000. Qui, la clausola GROUP BY viene utilizzata per raggruppare gli ordini per cliente, e quindi la clausola HAVING filtra i clienti in base all’importo totale dell’ordine.
USE AdventureWorksLT2019; SELECT c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount FROM SalesLT.Customer c JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.FirstName, c.LastName HAVING SUM(soh.TotalDue) > 2000;
- In questo elenco di codice, la tabella SalesLT.Customer viene unita alla tabella SalesLT.SalesOrderHeader sulla colonna ‘CustomerID’.
- L’elenco SELECT recupera ‘CustomerID’, ‘FirstName’, ‘LastName’ e ‘TotalOrderAmount’.
- La clausola GROUP BY viene utilizzata per raggruppare i risultati per cliente.
- La funzione di aggregazione SUM() calcola l’importo totale dell’ordine per ogni cliente.
- La clausola HAVING filtra i risultati raggruppati per selezionare solo i clienti il cui importo totale dell’ordine è superiore a $2000.
Puoi vedere i risultati di questo elenco di codice nella seguente figura:

Utilizzo di SQL GROUP BY con la clausola ORDER BY
Puoi anche utilizzare la clausola GROUP BY SQL con la clausola ORDER BY per ordinare il set di risultati per una o più colonne. L’esempio seguente utilizza il database AdventureWorksLT2019. Per illustrare l’uso della clausola ORDER BY con la clausola GROUP BY, puoi semplicemente prendere il codice dell’esempio precedente e aggiungere la clausola ORDER BY per ordinare i risultati visualizzando gli importi degli ordini più grandi in ordine decrescente.
USE AdventureWorksLT2019; SELECT c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount FROM SalesLT.Customer c JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID GROUP BY c.CustomerID, c.FirstName, c.LastName HAVING SUM(soh.TotalDue) > 2000 ORDER BY TotalOrderAmount DESC;
Puoi vedere i risultati nella figura seguente. Questi risultati mostrano l’elenco dei clienti con ordini superiori a $2000 in ordine decrescente, con i clienti che hanno gli ordini più grandi in cima.

Come puoi vedere, puoi fare molte cose con la clausola GROUP BY SQL. Ti ho mostrato come la clausola GROUP BY può essere utilizzata con più colonne, così come come le clausole HAVING e ORDER BY possono essere aggiunte per filtrare e ordinare i risultati.
Come sempre, sentiti libero di fare domande sulla clausola GROUP BY SQL. E se vuoi saperne di più su SQL Server, non esitare a consultare gli articoli precedenti nella mia serie SQL Server Essential.
Source:
https://petri.com/sql-group-by/