GROUP BY crée une ligne par groupe
Sans regroupement, une agrégation résume toutes les lignes en un seul résultat. GROUP BY categorie demande au contraire un calcul séparé pour chaque catégorie.
Toute colonne affichée sans fonction d’agrégation doit généralement apparaître dans GROUP BY. Cette règle rend explicite ce que représente une ligne du résultat.
SELECT
categorie,
SUM(montant) AS chiffre_affaires
FROM ventes
GROUP BY categorie
ORDER BY chiffre_affaires DESC;Plusieurs colonnes précisent le niveau de détail
Regrouper par ville et par canal produit une ligne pour chaque combinaison existante. Tunis-Boutique et Tunis-En ligne deviennent deux groupes distincts.
Ajouter une colonne au regroupement augmente souvent le nombre de lignes. Vérifiez que ce niveau de détail répond bien à la question métier.
SELECT
ville,
canal,
COUNT(*) AS nombre_ventes,
SUM(montant) AS chiffre_affaires
FROM ventes
GROUP BY ville, canal
ORDER BY ville ASC, chiffre_affaires DESC;WHERE filtre les lignes, HAVING filtre les groupes
WHERE intervient avant le regroupement. Il définit les ventes prises en compte. HAVING intervient après le calcul et conserve uniquement les groupes dont l’indicateur respecte une condition.
Pour analyser uniquement les ventes payées puis conserver les catégories dépassant 500 DT, utilisez les deux clauses à des étapes différentes.
- WHERE ne contient normalement pas l’agrégation à filtrer.
- HAVING peut utiliser SUM, COUNT ou AVG.
- L’alias d’agrégation n’est pas accepté dans HAVING par tous les moteurs.
SELECT categorie, SUM(montant) AS chiffre_affaires
FROM ventes
WHERE statut = 'Payée'
GROUP BY categorie
HAVING SUM(montant) >= 500
ORDER BY chiffre_affaires DESC;Contrôler un résultat agrégé
Additionnez les totaux par groupe et comparez-les au total global sur le même périmètre. Les deux résultats doivent coïncider lorsque chaque ligne appartient à un seul groupe.
Un écart signale souvent un filtre différent, une valeur NULL, un doublon ou une jointure qui multiplie les lignes.
Vérifiez votre compréhension
Affichez le chiffre d’affaires par ville, uniquement pour les villes dont le total atteint 500 DT, du total le plus élevé au plus faible.
SELECT ville, -- total
FROM ventes
GROUP BY -- groupe
HAVING -- seuil
ORDER BY -- classement;Progression
Avez-vous terminé cette leçon ?
Votre choix reste dans ce navigateur et se synchronise aussi avec votre compte lorsque vous êtes connecté.