Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Point de terminaison d’analytique SQL dans Microsoft Fabric
Entrepôt dans Microsoft Fabric
Base de données SQL dans Microsoft Fabric
Clause d’instruction SELECT qui divise le résultat de la requête en groupes de lignes, généralement en effectuant une ou plusieurs agrégations sur chaque groupe. L’instruction SELECT retourne une ligne pour chaque groupe.
Syntax
Conventions de la syntaxe Transact-SQL
Syntaxe conforme iso pour SQL Server et Azure SQL Database :
GROUP BY {
column-expression
| ROLLUP ( <group_by_expression> [ , ...n ] )
| CUBE ( <group_by_expression> [ , ...n ] )
| GROUPING SETS ( <grouping_set> [ , ...n ] )
| () --calculates the grand total
} [ , ...n ]
<group_by_expression> ::=
column-expression
| ( column-expression [ , ...n ] )
<grouping_set> ::=
() --calculates the grand total
| <grouping_set_item>
| ( <grouping_set_item> [ , ...n ] )
<grouping_set_item> ::=
<group_by_expression>
| ROLLUP ( <group_by_expression> [ , ...n ] )
| CUBE ( <group_by_expression> [ , ...n ] )
Syntaxe non conforme ISO pour SQL Server et Azure SQL Database (compatibilité descendante uniquement) :
GROUP BY {
ALL column-expression [ , ...n ]
| column-expression [ , ...n ] WITH { CUBE | ROLLUP }
}
Syntaxe pour Azure Synapse Analytics :
GROUP BY {
column-name [ WITH (DISTRIBUTED_AGG) ]
| column-expression
| ROLLUP ( <group_by_expression> [ , ...n ] )
} [ , ...n ]
Syntaxe pour le système de plateforme Analytics (PDW) :
GROUP BY {
column-name [ WITH (DISTRIBUTED_AGG) ]
| column-expression
} [ , ...n ]
Arguments
column-expression
Spécifie une colonne ou un calcul non agrégé sur une colonne. Il peut s’agir d’une colonne d’une table, d’une table dérivée ou d’une vue. La colonne doit apparaître dans la FROM clause de l’instruction SELECT , mais n’a pas besoin d’apparaître dans la SELECT liste.
Pour connaître les expressions valides, consultez expression.
La colonne doit apparaître dans la FROM clause de l’instruction SELECT , mais n’est pas nécessaire pour apparaître dans la SELECT liste. Toutefois, vous devez inclure chaque colonne de table ou d’affichage dans la GROUP BY liste si vous l’utilisez dans une expression non agrégée dans la <select> liste.
Options GROUP BY
Les options suivantes étendent la clause de base GROUP BY pour prendre en charge l’agrégation hiérarchique, la synthèse multidimensionnelle, les combinaisons de regroupement personnalisées et les comportements d’exécution spécifiques à la plateforme. Les requêtes peuvent utiliser ces options pour produire des sous-totaux et des totaux généraux dans une seule opération logique.
ROLLUP ( <group_by_expression> [ , ... n ] )
Génère des sous-totaux hiérarchiques pour les colonnes répertoriées et un total général final (par exemple, ,
(a,b,c),(a,b)(a),()). Utilisez-le pour les rapports d’exploration commele mois du trimestre> del’année>.CUBE ( <group_by_expression> [ , ... n ] )
Produit toutes les combinaisons des colonnes spécifiées (les 2^n lattices complètes) plus le total général. Utilisez-la pour une analyse multidimensionnelle sur chaque tranche.
GROUPING SETS ( <grouping_set> [ , ... n ] )
Définit les regroupements exacts à calculer (y compris
()pour le total général) en une seule passe. Cette option est fonctionnellement similaire à uneUNION ALLde plusieursGROUP BYrequêtes, mais optimisée ensemble.() (jeu de regroupement vide)
Shorthand for computing only the grand total across all rows. Utilisez-le seul comme
GROUP BY ()ou à l’intérieurGROUPING SETS.ALL column-expression [ , ... n ](non-ISO ; compatibilité descendante)
Shorthand to group by all nonaggregated select items. Conservé pour la compatibilité ; la disponibilité et la sémantique varient.
column-expression [ , ... n] WITH { CUBE | 'ROLLUP }(legacy form)
Syntaxe antérieure, non ISO équivalente à
GROUP BY CUBE(...)ouGROUP BY ROLLUP(...). Pris en charge pour la compatibilité descendante uniquement. Utilisez les sous-clauses ISO lorsque cela est possible.WITH (DISTRIBUTED_AGG)
Indicateurs d’exécution distribuée pour les agrégations lors du regroupement par une seule colonne. Les pools SQL dédiés Azure Synapse Analytics et pdW (Analytics Platform System) sont les seules plateformes qui prennent en charge cette option.
GROUP BY column-expression [ ,... n ]
Regroupe les résultats de l’instruction SELECT en fonction des valeurs d’une ou de plusieurs expressions de colonne.
Par exemple, cette requête crée une Sales table avec des colonnes pour Region, Territoryet Sales. Il insère quatre lignes, et deux des lignes ont des valeurs correspondantes pour Region et Territory.
CREATE TABLE Sales
(
Region VARCHAR (50),
Territory VARCHAR (50),
Sales INT
);
GO
INSERT INTO Sales VALUES (N'Canada', N'Alberta', 100);
INSERT INTO Sales VALUES (N'Canada', N'British Columbia', 200);
INSERT INTO Sales VALUES (N'Canada', N'British Columbia', 300);
INSERT INTO Sales VALUES (N'United States', N'Montana', 100);
Le Sales tableau contient ces lignes :
| Region | Du territoire | Sales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | Colombie-britannique | 200 |
| Canada | Colombie-britannique | 300 |
| United States | Montana | 100 |
Cette requête suivante regroupe Region et Territory retourne la somme d’agrégation pour chaque combinaison de valeurs.
SELECT Region,
Territory,
SUM(sales) AS TotalSales
FROM Sales
GROUP BY Region, Territory;
Le résultat de la requête comporte trois lignes, car il existe trois combinaisons de valeurs pour Region et Territory. Le TotalSales Canada et la Colombie-Britannique sont la somme de deux lignes.
| Region | Du territoire | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | Colombie-britannique | 500 |
| United States | Montana | 100 |
L’expression de colonne dans GROUP BY ne peut pas contenir :
- Alias de colonne que vous définissez dans la
SELECTliste. Il peut utiliser un alias de colonne pour une table dérivée définie dans laFROMclause. - Une colonne de type text, ntext ou image. Toutefois, vous pouvez utiliser une colonne de texte, ntext ou image comme argument pour une fonction qui retourne une valeur d’un type de données valide. Par exemple, l’expression peut utiliser
SUBSTRING()etCAST(). Cette règle s’applique également aux expressions de laHAVINGclause. - méthodes de type de données xml. Il peut inclure une fonction définie par l’utilisateur qui utilise des méthodes de type de données xml . Il peut inclure une colonne calculée qui utilise des méthodes de type de données xml .
- Une sous-question. La requête retourne l’erreur 144.
- Une colonne d’une vue indexée.
Les instructions suivantes sont autorisées :
SELECT ColumnA,
ColumnB
FROM T
GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB
FROM T
GROUP BY ColumnA, ColumnB;
SELECT ColumnA + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
SELECT ColumnA + ColumnB + constant
FROM T
GROUP BY ColumnA, ColumnB;
Les instructions suivantes ne sont pas autorisées :
SELECT ColumnA,
ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
SELECT ColumnA + constant + ColumnB
FROM T
GROUP BY ColumnA + ColumnB;
GROUP BY ROLLUP ()
Crée un groupe pour chaque combinaison d’expressions de colonne. En outre, il cumule les résultats en sous-totaux et totaux généraux. Lorsqu’il crée les groupes, il passe de droite à gauche, réduisant le nombre d’expressions de colonne pour le regroupement et les agrégations.
L’ordre des colonnes affecte la ROLLUP sortie et peut affecter le nombre de lignes dans le jeu de résultats.
Par exemple, GROUP BY ROLLUP (col1, col2, col3, col4) crée des groupes pour chaque combinaison d’expressions de colonne dans les listes suivantes :
- Col1, Col2, Col3, Col4
- col1, col2, col3, NULL
- col1, col2, NULL, NULL
- COL1, NUL, NUL, NUL
- NULL, NULL, NULL, NULL (Le groupe avec les
NULLvaleurs est le total général)
À l’aide de la table de l’exemple précédent, ce code exécute une GROUP BY ROLLUP opération au lieu d’une opération de base GROUP BY.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory);
Le résultat de la requête a les mêmes agrégations que la base GROUP BY sans le ROLLUP. En outre, il crée des sous-totaux pour chaque valeur de Région. Enfin, elle donne un total global pour toutes les lignes. Le résultat ressemble à ceci :
| Region | Du territoire | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| Canada | Colombie-britannique | 500 |
| Canada | NULL | 600 |
| United States | Montana | 100 |
| United States | NULL | 100 |
| NULL | NULL | 700 |
GROUP BY CUBE ()
GROUP BY CUBE crée des groupes pour toutes les combinaisons possibles de colonnes. Pour GROUP BY CUBE (a, b), les résultats ont des groupes pour des valeurs uniques de (a, b), (NULL, b), (a, NULL)et (NULL, NULL).
À l’aide du tableau des exemples précédents, ce code exécute une GROUP BY CUBE opération sur Region and Territory.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);
Le résultat de la requête contient des groupes pour des valeurs uniques de (Region, Territory), , (NULL, Territory)(Region, NULL)et (NULL, NULL). Le résultat ressemble à ceci :
| Region | Du territoire | TotalSales |
|---|---|---|
| Canada | Alberta | 100 |
| NULL | Alberta | 100 |
| Canada | Colombie-britannique | 500 |
| NULL | Colombie-britannique | 500 |
| United States | Montana | 100 |
| NULL | Montana | 100 |
| NULL | NULL | 700 |
| Canada | NULL | 600 |
| United States | NULL | 100 |
GROUP BY GROUPING SETS ()
L’option GROUPING SETS combine plusieurs GROUP BY clauses en une GROUP BY seule clause. Les résultats sont identiques à l’utilisation UNION ALL sur les groupes spécifiés.
Par exemple, GROUP BY ROLLUP (Region, Territory) et GROUP BY GROUPING SETS ( ROLLUP (Region, Territory)) retournent les mêmes résultats.
Lorsqu’il GROUPING SETS existe deux éléments ou plus, les résultats sont une union des éléments. Cet exemple retourne l’union des résultats et ROLLUP de la CUBE région et du territoire.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(ROLLUP(Region, Territory), CUBE(Region, Territory));
Les résultats sont identiques à cette requête qui retourne une union des deux GROUP BY instructions.
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY ROLLUP(Region, Territory)
UNION ALL
SELECT Region,
Territory,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY CUBE(Region, Territory);
SQL ne consolide pas les groupes en double générés pour une GROUPING SETS liste. Par exemple, dans GROUP BY ((), CUBE (Region, Territory)), les deux éléments retournent une ligne pour le total général, et les deux lignes apparaissent dans les résultats.
Prise en charge des fonctionnalités ISO et ANSI SQL-2006 GROUP BY
La GROUP BY clause prend en charge toutes les GROUP BY fonctionnalités incluses dans la norme SQL-2006 avec les exceptions de syntaxe suivantes :
Les jeux de regroupement ne sont pas autorisés dans la
GROUP BYclause, sauf s’ils font partie d’une liste expliciteGROUPING SETS. Par exemple,GROUP BY Column1, (Column2, ...ColumnN)est autorisé dans la norme, mais pas dans Transact-SQL. Transact-SQL prend en charge les syntaxesGROUP BY C1, GROUPING SETS ((Column2, ...ColumnN))etGROUP BY Column1, Column2, ... ColumnN, qui sont sémantiquement équivalentes. Ces clauses sont sémantiquement équivalentes à l’exemple précédentGROUP BY. Cette restriction évite la possibilité qu’elleGROUP BY Column1, (Column2, ...ColumnN)puisse être mal interprétée commeGROUP BY C1, GROUPING SETS ((Column2, ...ColumnN)), qui ne sont pas sémantiquement équivalentes.Les jeux de regroupement ne sont pas autorisés au sein de jeux de regroupement. Par exemple,
GROUP BY GROUPING SETS (A1, A2,...An, GROUPING SETS (C1, C2, ...Cn))est autorisé dans la norme SQL-2006, mais pas dans Transact-SQL. Transact-SQL autoriseGROUP BY GROUPING SETS( A1, A2,...An, C1, C2, ...Cn)ouGROUP BY GROUPING SETS( (A1), (A2), ... (An), (C1), (C2), ... (Cn)), qui sont sémantiquement équivalents au premierGROUP BYexemple et ont une syntaxe plus claire.
GROUPE PAR ()
Spécifie le groupe vide qui génère le total général. Ce groupe est utile comme l’un des éléments d’un GROUPING SET. Par exemple, cette instruction donne le total des ventes pour chaque région, puis donne le total général pour toutes les régions.
SELECT Region,
SUM(Sales) AS TotalSales
FROM Sales
GROUP BY GROUPING SETS(Region, ());
GROUP BY ALL column-expression [ ,... n ]
S’applique à : SQL Server et Azure SQL Database
Note
Utilisez cette syntaxe uniquement pour la compatibilité descendante. Évitez d’utiliser cette syntaxe dans de nouveaux travaux de développement et prévoyez de modifier les applications qui utilisent actuellement cette syntaxe.
Spécifie s’il faut inclure tous les groupes dans les résultats, qu’ils répondent aux critères de recherche dans la WHERE clause. Les groupes qui ne répondent pas aux critères de recherche ont NULL pour l’agrégation.
GROUP BY ALL :
- N’est pas pris en charge dans les requêtes qui accèdent aux tables distantes s’il existe également une
WHEREclause dans la requête. - Échoue sur les colonnes qui ont l’attribut FILESTREAM.
Prise en charge des fonctionnalités ISO et ANSI SQL-2006 GROUP BY
La GROUP BY clause prend en charge toutes les GROUP BY fonctionnalités incluses dans la norme SQL-2006 avec les exceptions de syntaxe suivantes :
- Vous ne pouvez utiliser
GROUP BY ALLetGROUP BY DISTINCTdans une clause de baseGROUP BYqui contient des expressions de colonne. Vous ne pouvez pas les utiliser avec les constructions ou lesGROUPING SETSconstructionsROLLUPCUBEWITH CUBEWITH ROLLUP.ALLest la valeur par défaut et est implicite. Vous ne pouvez l’utiliser que dans la syntaxe rétrocompatible.
GROUP BY column-expression [ ,... n ] WITH { CUBE | ROLLUP }
S’applique à : SQL Server et Azure SQL Database
Note
Utilisez cette syntaxe uniquement pour la compatibilité descendante. Évitez d’utiliser cette syntaxe dans de nouveaux travaux de développement et prévoyez de modifier les applications qui utilisent actuellement cette syntaxe.
AVEC (DISTRIBUTED_AGG)
S’applique à : Azure Synapse Analytics and Analytics Platform System (PDW)
L’indicateur DISTRIBUTED_AGG de requête force le système de traitement massivement parallèle (MPP) à redistribuer une table sur une colonne spécifique avant d’effectuer une agrégation. Vous pouvez utiliser l’indicateur de DISTRIBUTED_AGG requête sur une seule colonne de la GROUP BY clause. À la fin de la requête, la table redistribuée est supprimée. La table d’origine n’est pas modifiée.
Note
L’indicateur DISTRIBUTED_AGG de requête fournit une compatibilité descendante avec les versions antérieures de PDW (Analytics Platform System) et n’améliore pas les performances de la plupart des requêtes. Par défaut, MPP redistribue déjà les données de façon à améliorer les performances des agrégations.
Remarques
Interactions de GROUP BY avec l’instruction SELECT
SELECT Liste:
- Agrégats vectoriels. Si vous incluez des fonctions d’agrégation dans la
SELECTliste,GROUP BYcalcule une valeur récapitulative pour chaque groupe. Ces fonctions sont appelées agrégats vectoriels. - Agrégats distincts. Les agrégats
AVG(DISTINCT <column_name>),COUNT(DISTINCT <column_name>)etSUM(DISTINCT <column_name>)fonctionnent avecROLLUP,CUBEetGROUPING SETS.
Clause WHERE :
- SQL supprime les lignes qui ne répondent pas aux conditions de la
WHEREclause avant d’effectuer une opération de regroupement.
Clause HAVING :
- SQL utilise la
HAVINGclause pour filtrer les groupes dans le jeu de résultats.
Clause ORDER BY :
- Utilisez la
ORDER BYclause pour classer le jeu de résultats. LaGROUP BYclause ne trie pas le jeu de résultats.
valeurs NULL :
- Si une colonne de regroupement contient
NULLdes valeurs, le moteur de base de données traite toutes lesNULLvaleurs comme égales et les collecte dans un seul groupe.
Limites
S’applique à : SQL Server et Azure Synapse Analytics
Pour une GROUP BY clause qui utilise ROLLUP, CUBEou GROUPING SETS, le nombre maximal d’expressions est 32. Le nombre maximal de groupes est de 4 096 (212). Les exemples suivants échouent, car la GROUP BY clause comporte plus de 4 096 groupes.
L’exemple suivant génère 4 097 (212 + 1) ensembles de regroupements, puis échoue.
GROUP BY GROUPING SETS( CUBE(a1, ..., a12), b)L’exemple suivant génère 4 097 groupes (212 + 1), puis échoue.
CUBE ()et le jeu de regroupement()produisent une ligne de total général. Les jeux de regroupement en double ne sont pas éliminés.GROUP BY GROUPING SETS( CUBE(a1, ..., a12), ())Cet exemple utilise la syntaxe compatible descendante. Il génère 8 192 (213) ensembles de regroupements, puis échoue.
GROUP BY CUBE (a1, ..., a13) GROUP BY a1, ..., a13 WITH CUBEPour les clauses compatibles descendantes
GROUP BYqui ne contiennentCUBEpas ouROLLUP, lesGROUP BYtailles de colonne, les colonnes agrégées et les valeurs d’agrégation impliquées dans la requête limitent le nombre d’élémentsGROUP BY. Cette limite provient de la limite de 8 060 octets sur la table de travail intermédiaire qui contient les résultats de requête intermédiaires. Vous pouvez utiliser au maximum 12 expressions de regroupement lorsque vous spécifiezCUBEouROLLUP.
Comparaison des fonctionnalités GROUP BY prises en charge
Le tableau suivant décrit les GROUP BY fonctionnalités prises en charge par différents produits.
| Feature | SQL Server Integration Services | SQL Server 1 |
|---|---|---|
DISTINCT Agrégats |
Non pris en charge pour WITH CUBE ou WITH ROLLUP. |
Prise en charge pour WITH CUBE, , WITH ROLLUPGROUPING SETS, CUBEou ROLLUP. |
Fonction définie par l’utilisateur avec CUBE ou ROLLUP nom dans la GROUP BY clause |
La fonction dbo.cube(<arg1>, ...<argN>) définie par l’utilisateur ou dbo.rollup(<arg1>, ...<argN>) dans la GROUP BY clause est autorisée.Par exemple : SELECT SUM (x) FROM T GROUP BY dbo.cube(y); |
La fonction dbo.cube (<arg1>, ...<argN>) définie par l’utilisateur ou dbo.rollup(<arg1>, ...<argN>) dans la GROUP BY clause n’est pas autorisée.Par exemple : SELECT SUM (x) FROM T GROUP BY dbo.cube(y);SQL Server retourne un message d’erreur 2. Pour éviter ce problème, remplacez dbo.cube par [dbo].[cube] ou dbo.rollup par [dbo].[rollup].L’exemple suivant est autorisé : SELECT SUM (x) FROM T GROUP BY [dbo].[cube](y); |
GROUPING SETS |
Non prise en charge | Supported |
CUBE |
Non prise en charge | Supported |
ROLLUP |
Non prise en charge | Supported |
Total général, tel que GROUP BY() |
Non prise en charge | Supported |
GROUPING_ID Fonction |
Non prise en charge | Supported |
GROUPING Fonction |
Supported | Supported |
WITH CUBE |
Supported | Supported |
WITH ROLLUP |
Supported | Supported |
WITH CUBE ou WITH ROLLUP suppression de regroupement « dupliquée » |
Supported | Supported |
1Niveau de compatibilité de base de données 100 et versions ultérieures.
2 Le message d’erreur retourné est : Incorrect syntax near the keyword 'cube'|'rollup'.
Examples
Les exemples de code de cet article utilisent les bases de données d'exemple AdventureWorks2025 ou AdventureWorksDW2025, que vous pouvez télécharger à partir de la page d'accueil Microsoft SQL Server Samples and Community Projects.
A. Utiliser une clause GROUP BY de base
L'exemple suivant extrait le total pour chaque SalesOrderID de la table SalesOrderDetail. Cet exemple utilise AdventureWorks.
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail AS sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
B. Utiliser 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. Cet exemple utilise AdventureWorks.
SELECT a.City,
COUNT(bea.AddressID) AS EmployeeCount
FROM Person.BusinessEntityAddress AS bea
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City;
C. Utiliser 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. Vous devez inclure la même expression dans la liste et SELECT la GROUP BY clause.
SELECT DATEPART(yyyy, OrderDate) AS N'Year',
SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy, OrderDate)
ORDER BY DATEPART(yyyy, OrderDate);
D. Utiliser une clause GROUP BY avec une clause HAVING
L’exemple suivant utilise la HAVING clause pour spécifier quels groupes générés dans la GROUP BY clause doivent être inclus dans le jeu de résultats.
SELECT DATEPART(yyyy, OrderDate) AS N'Year',
SUM(TotalDue) AS N'Total Order Amount'
FROM Sales.SalesOrderHeader
GROUP BY DATEPART(yyyy, OrderDate)
HAVING DATEPART(yyyy, OrderDate) >= N'2003'
ORDER BY DATEPART(yyyy, OrderDate);
Exemples : Azure Synapse Analytics et Analytics Platform System (PDW)
E. Utilisation de base de la clause GROUP BY
L’exemple suivant calcule le montant total des ventes réalisées par jour. La requête retourne une ligne contenant la somme de toutes les ventes pour chaque jour.
-- Uses AdventureWorksDW
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
F. Utilisation de base de l’indicateur DISTRIBUTED_AGG
Cet exemple utilise l’indicateur de requête DISTRIBUTED_AGG pour forcer l’appliance à mélanger la table sur la CustomerKey colonne avant d’effectuer l’agrégation.
-- Uses AdventureWorksDW
SELECT CustomerKey,
SUM(SalesAmount) AS sas
FROM FactInternetSales
GROUP BY CustomerKey WITH(DISTRIBUTED_AGG)
ORDER BY CustomerKey DESC;
G. Variantes de syntaxe pour GROUP BY
Lorsque la liste de sélection n’a aucune agrégation, vous devez inclure chaque colonne dans la liste de sélection.GROUP BY Vous pouvez inclure des colonnes calculées dans la liste de sélection, mais vous n’êtes pas obligé de les inclure dans la GROUP BY liste. Ces exemples montrent des instructions valides SELECT de manière syntactique :
-- Uses AdventureWorks
SELECT LastName,
FirstName
FROM DimCustomer
GROUP BY LastName, FirstName;
SELECT NumberCarsOwned
FROM DimCustomer
GROUP BY YearlyIncome, NumberCarsOwned;
SELECT (SalesAmount + TaxAmt + Freight) AS TotalCost
FROM FactInternetSales
GROUP BY SalesAmount, TaxAmt, Freight;
SELECT SalesAmount,
SalesAmount * 1.10 AS SalesTax
FROM FactInternetSales
GROUP BY SalesAmount;
SELECT SalesAmount
FROM FactInternetSales
GROUP BY SalesAmount, SalesAmount * 1.10;
H. Utiliser une clause GROUP BY avec plusieurs expressions GROUP BY
L’exemple suivant regroupe les résultats selon plusieurs critères GROUP BY. Si, dans chaque OrderDateKey groupe, des sous-groupes existent que la DueDateKey valeur différencie, la requête définit un nouveau regroupement pour le jeu de résultats.
-- Uses AdventureWorks
SELECT OrderDateKey,
DueDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, DueDateKey
ORDER BY OrderDateKey;
I. Utiliser une clause GROUP BY avec une clause HAVING
L’exemple suivant utilise la HAVING clause pour spécifier les groupes générés dans la GROUP BY clause qui doivent être inclus dans le jeu de résultats. Seuls les groupes avec des dates de commande en 2004 ou version ultérieure sont inclus dans les résultats.
-- Uses AdventureWorks
SELECT OrderDateKey,
SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20040000
ORDER BY OrderDateKey;