GROUP BY (Transact-SQL)

Data aggiornamento: 17 luglio 2006

Specifica i gruppi in cui inserire le righe di output e, se l'elenco di selezione <select list> della clausola SELECT include funzioni di aggregazione, calcola un valore di riepilogo per ogni gruppo. Quando si specifica GROUP BY, è necessario che l'elenco GROUP BY includa tutte le colonne di un'espressione non di aggregazione dell'elenco di selezione oppure che l'espressione GROUP BY corrisponda esattamente all'espressione dell'elenco di selezione.

[!NOTA] Se la clausola ORDER BY viene omessa, i gruppi restituiti dalla clausola GROUP BY non sono in un ordine preciso. È consigliabile utilizzare sempre la clausola ORDER BY per specificare un ordinamento dei dati specifico.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

[ GROUP BY [ ALL ] group_by_expression [ ,...n ] 
    [ WITH { CUBE | ROLLUP } ] 
] 

Argomenti

  • ALL
    Include tutti i gruppi e i set di risultati, compresi quelli in cui nessuna riga soddisfa le condizioni di ricerca della clausola WHERE. Quando viene specificata l'opzione ALL, per le colonne di riepilogo dei gruppi che non soddisfano la condizione di ricerca vengono restituiti valori Null. Non è possibile specificare l'opzione ALL con gli operatori CUBE o ROLLUP.

    Le operazioni GROUP BY ALL non sono supportate in query che accedono a tabelle remote se la query include anche una clausola WHERE.

  • group_by_expression
    Espressione in base alla quale viene eseguito un raggruppamento. L'argomento group_by_expression è noto anche come colonna di raggruppamento. group_by expression può essere una colonna oppure un'espressione non di aggregazione che fa riferimento a una colonna restituita dalla clausola FROM. Non è possibile utilizzare un alias di colonna definito nell'elenco di selezione per specificare una colonna di raggruppamento.

    [!NOTA] Le colonne di tipo text, ntext e image non possono essere utilizzate in group_by_expression.

    Per clausole GROUP BY che non includono gli operatori CUBE o ROLLUP, il numero di elementi group_by_expression è limitato dalle dimensioni delle colonne GROUP BY, dalle colonne di aggregazione e dai valori di aggregazione interessati dalla query. Tale limite è correlato al limite di 8.060 byte della tabella di lavoro intermedia necessaria per mantenere i risultati intermedi delle query. Quando viene specificato l'operatore CUBE o ROLLUP, sono consentite al massimo 10 espressioni di raggruppamento.

    I metodi con tipo di dati xml non possono essere specificati direttamente in group_by_expression. In alternativa, è possibile fare riferimento a una funzione definita dall'utente che utilizza i metodi con tipo di dati xml al suo interno, oppure a una colonna calcolata che utilizza tali metodi.

  • CUBE
    Specifica che, oltre alle righe normalmente restituite dalla clausola GROUP BY, nel set di risultati vengono inserite righe di riepilogo. Viene restituita una riga di riepilogo GROUP BY per ogni possibile combinazione di gruppo e sottogruppo del set di risultati. Una riga di riepilogo GROUP BY viene visualizzata come NULL nel set di risultati, ma viene utilizzata per indicare tutti i valori. Utilizzare la funzione GROUPING per determinare se i valori Null del set di risultati sono valori di riepilogo GROUP BY.

    Il numero di righe di riepilogo del set di risultati è determinato dal numero di colonne elencate nella clausola GROUP BY. Ogni operando (colonna) della clausola GROUP BY è associato al raggruppamento NULL e tale raggruppamento viene applicato a tutti gli altri operandi (colonne). Poiché l'operatore CUBE restituisce ogni possibile combinazione di gruppo e sottogruppo, il numero di righe è lo stesso, indipendentemente dall'ordine in cui vengono specificate le colonne di raggruppamento.

  • ROLLUP
    Specifica che, oltre alle righe normalmente restituite dalla clausola GROUP BY, nel set di risultati vengono inserite righe di riepilogo. I gruppi vengono riepilogati in ordine gerarchico, dal livello inferiore al livello superiore del gruppo. La gerarchia del gruppo viene determinata dall'ordine in cui vengono specificate le colonne di raggruppamento. La modifica dell'ordine delle colonne di raggruppamento può influire sul numero di righe restituite nel set di risultati.

    ms177673.note(it-it,SQL.90).gifImportante:
    Le funzioni di aggregazione Distinct, ad esempio AVG(DISTINCT column_name), COUNT(DISTINCT column_name) e SUM(DISTINCT column_name), non sono supportate da CUBE o ROLLUP. Se si utilizzano tali operatori, Microsoft Motore di database di SQL Server 2005 restituisce un messaggio di errore e la query viene annullata.

Esempi

A. Utilizzo di una clausola GROUP BY semplice

Nell'esempio seguente viene recuperato il totale per ogni SalesOrderID dalla tabella SalesOrderDetail.

USE AdventureWorks ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;

B. Utilizzo di una clausola GROUP BY con più tabelle

Nell'esempio seguente viene recuperato il numero di dipendenti per ogni City dalla tabella Address unita in join con la tabella EmployeeAddress.

USE AdventureWorks ;
GO
SELECT a.City, COUNT(ea.AddressID) EmployeeCount
FROM HumanResources.EmployeeAddress ea 
INNER JOIN Person.Address a
ON ea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City ;

C. Utilizzo di una clausola GROUP BY con un'espressione

Nell'esempio seguente vengono recuperate le vendite totali per ogni anno tramite la funzione DATEPART. Nell'elenco di selezione e nella clausola GROUP BY deve essere presente la stessa espressione.

USE AdventureWorks ;
GO
SELECT DATEPART(yyyy,OrderDate) AS Year,
SUM(TotalDue) AS AverageOrderAmt
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy,OrderDate)
ORDER BY DATEPART(yyyy,OrderDate) ;

Vedere anche

Riferimento

SELECT (Transact-SQL)
SELECT Clause (Transact-SQL)

Altre risorse

Riepilogo dei dati con l'operatore CUBE
Riepilogo dei dati con l'operatore ROLLUP

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

17 luglio 2006

Nuovo contenuto:
  • Aggiunta dell'esempio C.

5 dicembre 2005

Contenuto modificato
  • Correzione dell'esempio B.