Instruction GROUP BY SQL
- Page précédente sum() SQL
- Page suivante HAVING SQL
Les fonctions agrégées (comme SUM) nécessitent souvent l'ajout de la clause GROUP BY.
Clause GROUP BY
La clause GROUP BY est utilisée pour regrouper les résultats d'une requête en utilisant une ou plusieurs colonnes.
Syntaxe de SQL GROUP BY
SELECT column_name, fonction_aggrégée(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
Exemple de SQL GROUP BY
Nous possédons le tableau "Orders" suivant :
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
Maintenant, nous souhaitons trouver le montant total (total des commandes) de chaque client.
Nous voulons utiliser la clause GROUP BY pour regrouper les clients.
Nous utilisons l'instruction SQL suivante :
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
Le jeu de résultats ressemble à ceci :
Customer | SUM(OrderPrice) |
---|---|
Bush | 2000 |
Carter | 1700 |
Adams | 2000 |
Très bien, n'est-ce pas ?
Voyons ce qui se passe si nous omettons GROUP BY :
SELECT Customer,SUM(OrderPrice) FROM Orders
Le jeu de résultats ressemble à ceci :
Customer | SUM(OrderPrice) |
---|---|
Bush | 5700 |
Carter | 5700 |
Bush | 5700 |
Bush | 5700 |
Adams | 5700 |
Carter | 5700 |
Le jeu de résultats ci-dessus n'est pas ce que nous voulons.
Alors pourquoi ne pas utiliser cette instruction SELECT ci-dessus ? Explication suivante : l'instruction SELECT ci-dessus spécifie deux colonnes (Customer et SUM(OrderPrice)). "SUM(OrderPrice)" renvoie une valeur unique (le total de la colonne "OrderPrice"), tandis que "Customer" renvoie 6 valeurs (chaque valeur correspond à une ligne de la table "Orders"). Par conséquent, nous ne obtenons pas le résultat correct. Cependant, comme vous avez vu, la clause GROUP BY résout ce problème.
GROUP BY une colonne supérieure à une
Nous pouvons également appliquer la clause GROUP BY à une colonne supérieure à une, comme suit :
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate
- Page précédente sum() SQL
- Page suivante HAVING SQL