Clausola GROUP BY di SQL Server
- 12-09-2022
- Toanngo92
- 0 Comments
Mục lục
Raggruppa per clausola
La clausola GROUP BY divide il set di risultati in uno o più sottoinsiemi. Ogni sottoinsieme ha valori ed espressioni comuni. La parola chiave GROUP BY è seguita da un elenco di colonne, chiamato colonna raggruppata . Ciascuna colonna raggruppata limita il numero di righe del set di risultati. Per ogni colonna raggruppata è presente una sola riga. La clausola GROUP BY può avere più di una colonna raggruppata.
Sintassi:
SELECT select_list FROM table_name GROUP BY column_name1,column_name2, ... ;
Considera lo scenario della tabella WorkOrderRouting in AdventureWorks2019 . È necessario calcolare le ore risorse totali per ciascun ordine di lavoro. Per ottenere ciò, i record devono essere raggruppati in base al numero dell’ordine di lavoro, che è la colonna WorkOrderID
L’esempio seguente recupera e visualizza le ore totali di risorse per ciascun ordine di lavoro insieme al numero dell’ordine di lavoro. In questa query, per calcolare la somma viene utilizzata una funzione incorporata denominata SUM(). SUM() è una funzione che somma i record di una colonna.
SELECT WorkOrderID,SUM(ActualResourceHrs) AS TotalHoursPerWorkOrder FROM Production.WorkOrderRouting GROUP BY WorkOrderID
L’istruzione execute restituirà tutti gli ordini di lavoro e le ore totali di risorse.
La clausola GROUP BY può essere utilizzata anche in combinazione con altre clausole quali:
GRUPPO BY con DOVE
La clausola WHERE può essere utilizzata con la clausola GROUP BY per limitare le righe per il raggruppamento dei dati. Le righe che soddisfano i criteri di ricerca verranno prese in considerazione per il raggruppamento. Le righe che non soddisfano i criteri di ricerca verranno rimosse prima del completamento del processo di raggruppamento.
Per esempio:
SELECt WorkOrderID,SUM(ActualResourceHrs) AS TotalHoursPerWorkOrder FROM Production.WorkOrderRouting WHERE WorkOrderID < 50 GROUP BY WorkOrderID
GRUPPO BY con NULL
Se la colonna del gruppo contiene null, la riga diventa un gruppo separato nel set di risultati. Se la colonna del gruppo contiene più di un valore NULL, i valori NULL vengono inclusi in una singola riga. Considera la tabella Produzione.Prodotto . Sono presenti alcune righe in cui è presente un valore NULL nella colonna Class .
L’utilizzo di GROUP BY per una query di tabella utilizzerà anche i valori NULL. Ad esempio, il codice seguente recupera e visualizza il prezzo medio del prezzo di listino per ciascuna Classe
SELECT Class, AVG(ListPrice) AS 'AverageListPrice' FROM Production.Product GROUP BY Class
GRUPPO CON TUTTI
La parola chiave ALL può essere utilizzata con la clausola GROUP BY. Ha senso solo quando SELECT ha una clausola WHERE. Quando viene utilizzato ALL, include tutti i gruppi creati dalla clausola GROUP BY. Include anche gruppi che non soddisfano le condizioni di ricerca.
Sintassi:
SELECT <column_name> FROM <table_name> WHERE <condition> GROUP BY ALL <column_name>
Si consideri la tabella Sales.SalesTerritory, che ha una colonna denominata Group che indica la posizione delle coordinate dell’area di vendita. Il codice seguente calcolerà e visualizzerà le vendite totali per ciascun gruppo. L’output deve mostrare tutti i gruppi indipendentemente dal fatto che abbiano o meno vendite. Per ottenere ciò, il codice utilizza GROUP BY con ALL
SELECT [Group], SUM(SalesYTD) AS 'TotalSales' FROM Sales.SalesTerritory WHERE [Group] LIKE 'N%' OR [Group] LIKE 'E%' GROUP BY ALL [Group]
GROUP BY con AVERE
La clausola HAVING viene utilizzata con l’istruzione SELECT per specificare una condizione di ricerca per un gruppo. La clausola HAVING agisce come una clausola WHERE nei punti in cui la clausola WHERE non può essere utilizzata contro funzioni aggregate come SUM(). Dopo aver creato i gruppi con la clausola GROUP BY, potresti voler filtrare ulteriormente i risultati. La clausola HAVING funge da filtro sulle righe, analogamente a come la clausola WHERE funge da filtro sulle righe restituite dalla clausola FROM.
Sintassi:
SELECT <column_name> FROM <table_name> GROUP BY <column_name> HAVING <search_condition>
Per esempio:
SELECT [Group],SUM(SalesYTD) AS 'TotalSales' FROM Sales.SalesTerritory WHERE [Group] LIKE 'P%' GROUP BY ALL [Group] HAVING SUM (SalesYTD) < 6000000
Riepilogo dei dati
La clausola GROUP BY utilizza anche gli operatori CUBE e ROLLUP per restituire dati di riepilogo. Il numero di colonne nella clausola GROUP BY determina il numero di righe di riepilogo nel set di risultati. Gli operatori sono descritti come segue:
CUBO
CUBE è l’operatore aggregato che genera una riga super aggregata. Oltre alle righe regolari fornite da GROUP BY, fornisce anche un riepilogo delle righe prodotte dalla clausola GROUP BY.
La riga di riepilogo visualizzata per ogni possibile combinazione di gruppi è il set di risultati. La riga Riepilogo mostra NULL nel set di risultati, ma restituisce tutti i valori per quelli contemporaneamente.
Sintassi:
SELECT <column_name> FROM <table_name> GROUP BY <column_name> WITH CUBE
Per esempio:
Il servizio mostra le vendite totali per ogni paese, esclusi Australia e Canada
SELECT Name, CountryRegionCode, SUM(SalesYTD) AS TotalSales FROM Sales.SalesTerritory WHERE Name <> 'Australia' AND Name <> 'Canada' GROUP BY Name,CountryRegionCode WITH CUBE
CUBE è come un’estensione della clausola GROUP BY. CUBE consente di eseguire il subtotale per tutte le combinazioni di colonne del gruppo specificate nella clausola GROUP BY.
ROLLUP
Oltre alle righe regolari generate da GROUP BY, inserisce anche righe di riepilogo nel set di risultati. È simile all’operatore CUBE, ma produce un set di risultati che visualizza i gruppi in ordine gerarchico. Ordina i gruppi dal più basso al più alto. La gerarchia di raggruppamento nei risultati dipende dall’ordine in cui sono specificate le colonne raggruppate
Sintassi:
SELECT <column_name1>[,<column_name2>] FROM <table_name> GROUP BY < WITH ROLLUP
Per esempio:
SELECT [Name], SUM(SalesYTD) AS TotalSales FROM Sales.SalesTerritory GROUP BY [Name] WITH ROLLUP