COUNT & GROUP BY
GROUP BY range les lignes en groupes selon une ou plusieurs colonnes, puis COUNT, SUM ou AVG calculent une valeur par groupe. On obtient un tableau de synthèse, une ligne par groupe.
- compter
- grouper
- agrégat
- COUNT DISTINCT
Syntaxe
SELECT col_groupe, COUNT(*) AS nbFROM tableGROUP BY col_groupe;Exemple
SELECT status, COUNT(*) AS nb_commandesFROM ordersGROUP BY statusORDER BY nb_commandes DESC, status;-- Jeu de données : boutique-- Résultat attendu :-- livré | 3-- annulé | 1-- en cours | 1À retenir
- COUNT(*) compte les lignes, COUNT(col) ignore les NULL de cette colonne, COUNT(DISTINCT col) compte les valeurs différentes.
- GROUP BY peut porter sur plusieurs colonnes (GROUP BY city, status) : un groupe par combinaison existante.
- Les lignes où la colonne de regroupement vaut NULL forment un groupe à part entière.
- Piège : SQLite accepte une colonne qui n'est ni dans GROUP BY ni dans un agrégat (SELECT status, order_date … GROUP BY status) et renvoie alors une valeur prise dans une ligne quelconque du groupe. PostgreSQL et SQL Server refusent la requête. Ne dépendez jamais de ce comportement.
Voir aussi
- SUM, AVG, MIN, MAXCes fonctions résument une colonne numérique en une seule valeur : total, moyenne, plus petite et plus grande valeur, sur toute la table ou par groupe. Base de tout indicateur chiffré.
- HAVINGHAVING filtre les groupes après le calcul des agrégats, là où WHERE filtre les lignes avant. On l'utilise pour garder, par exemple, les clients ayant passé au moins deux commandes.
- Agrégation conditionnellePlacer un CASE dans un agrégat permet de calculer plusieurs indicateurs en un seul passage, un par colonne. C'est la technique du tableau croisé : une ligne par client, une colonne par statut.
- Ordre logique d'exécutionUne requête ne s'évalue pas dans l'ordre où on l'écrit : FROM vient d'abord, SELECT presque à la fin. Connaître cet ordre explique la plupart des erreurs d'alias et d'agrégats.