GROUP BY (Transact-SQL)
Mis à jour : 17 juillet 2006
Spécifie les groupes sur lesquels positionner les lignes de sortie. Si les fonctions d'agrégation sont comprises dans la clause SELECT <select list>, GROUP BY calcule une valeur de résumé pour chaque groupe. Lorsque GROUP BY est spécifiée, vous devez inclure dans la liste GROUP BY chaque colonne de toute expression de non-agrégation figurant dans la liste de sélection, ou l'expression GROUP BY doit correspondre exactement à l'expression figurant dans la liste de sélection.
Remarque : |
---|
Si la clause ORDER BY n'est pas spécifiée, les groupes retournés à l'aide de la clause GROUP BY ne se trouvent pas dans un ordre particulier. Nous vous recommandons de toujours utiliser la clause ORDER BY pour définir un ordre de données particulier. |
Conventions de syntaxe de Transact-SQL
Syntaxe
[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
]
Arguments
ALL
Comprend tous les groupes et ensembles de résultats, même ceux qui ne contiennent aucune ligne répondant aux critères de recherche spécifiés dans la clause WHERE. Lorsque ALL est spécifié, les valeurs NULL sont retournées aux colonnes de résumé de groupes ne répondant pas aux critères de recherche. Vous ne pouvez pas spécifier ALL avec les opérateurs CUBE ou ROLLUP.L'opération GROUP BY ALL n'est pas prise en charge dans les requêtes qui demandent l'accès aux tables distantes si une clause WHERE est également présente dans la requête.
group_by_expression
expression sur laquelle est effectué un groupement. L'argument group_by_expression porte également le nom de colonne de regroupement. L'argument group_by expression peut être une colonne ou une expression de non-agrégation qui désigne une colonne retournée par la clause FROM. Un alias de colonne défini dans la liste de sélection ne peut pas être utilisé pour spécifier une colonne de regroupement.Remarque : Vous ne pouvez pas utiliser les colonnes de type text, ntext et image dans group_by_expression. Pour les clauses GROUP BY ne contenant pas CUBE ou ROLLUP, le nombre d'éléments de group_by_expression est limité aux tailles de colonne GROUP BY, aux colonnes agrégées et aux valeurs d'agrégation impliquées dans la requête. Cette limite provient de la limite de 8 060 octets de la table de travail intermédiaire requise pour stocker les résultats de requêtes intermédiaires. Un maximum de 10 expressions de regroupement est autorisé quand CUBE ou ROLLUP est spécifié.
Les méthodes de types de données xml ne peuvent pas être directement spécifiées dans group_by_expression. Consultez plutôt une fonction définie par l'utilisateur qui a recours aux méthodes des types de données xml, ou consultez une colonne calculée qui les utilise.
CUBE
Spécifie qu'en plus des lignes habituelles fournies par GROUP BY, des lignes de résumé sont introduites dans l'ensemble de résultats. Une ligne de résumé GROUP BY est retournée pour toute combinaison possible de groupes et de sous-groupes dans l'ensemble de résultats. Une ligne de résumé GROUP BY s'affiche comme valeur NULL dans le résultat mais est utilisée pour indiquer toutes les valeurs. Utilisez la fonction GROUPING pour déterminer si les valeurs NULL de l'ensemble de résultats sont des valeurs de résumé GROUP BY.Le nombre de lignes de résumé dans l'ensemble de résultats est déterminé par le nombre de colonnes incluses dans la clause GROUP BY. Chaque opérande (colonne) de la clause GROUP BY est liée sous le regroupement NULL et celui-ci est appliqué à tous les autres opérandes (colonnes). Dans la mesure où CUBE retourne toutes les combinaisons de groupes et de sous-groupes possibles, le nombre de lignes est le même, quel que soit l'ordre dans lequel les colonnes de regroupement sont spécifiées.
ROLLUP
Spécifie qu'en plus des lignes habituelles fournies par GROUP BY, des lignes de résumé sont introduites dans l'ensemble de résultats. Les groupes sont résumés dans un ordre hiérarchique, du plus bas au plus haut niveau de groupe. La hiérarchie du groupe est déterminée par l'ordre dans lequel les colonnes de regroupement sont spécifiées. La modification de l'ordre des colonnes de regroupement peut influer sur le nombre de lignes produites dans l'ensemble de résultats.Important : Les fonctions d'agrégation Distinct, par exemple AVG(DISTINCT column_name), COUNT(DISTINCT column_name) et SUM(DISTINCT column_name), ne sont pas prises en charge lorsque vous utilisez CUBE ou ROLLUP. En cas d'utilisation, le moteur de base de données Microsoft SQL Server 2005 retourne un message d'erreur et annule la requête.
Exemples
A. Utilisation d'une clause GROUP BY simple
L'exemple suivant extrait le total pour chaque SalesOrderID
de la table SalesOrderDetail
.
USE AdventureWorks ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;
B. Utilisation d'une clause GROUP BY avec plusieurs tables
L'exemple suivant extrait le nombre d'employés pour chaque City
de la table Address
en conjonction avec la table 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. Utilisation d'une clause GROUP BY avec une expression
L'exemple suivant récupère le total des ventes pour chaque année en utilisant la fonction DATEPART
. La même expression doit être présente dans la liste de sélection et dans la clause GROUP BY
.
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) ;
Voir aussi
Référence
SELECT (Transact-SQL)
Clause SELECT (Transact-SQL)
Autres ressources
Synthèse de données à l'aide de CUBE
Synthèse de données à l'aide de ROLLUP
Aide et Informations
Assistance sur SQL Server 2005
Historique des modifications
Version | Historique |
---|---|
17 juillet 2006 |
|
5 décembre 2005 |
|