Chapitre 9Projet SunuShop

Fonctions d'agrégation — COUNT, SUM, AVG, GROUP BY

Les 5 fonctions (COUNT, COUNT DISTINCT, SUM, AVG, MIN, MAX). GROUP BY — regrouper par catégorie, par mois, par client. HAVING — filtrer les groupes (HAVING vs WHERE). Stats catalogue, CA, panier moyen, top clients.

Concepts Théoriques

Les fonctions d'agrégation calculent une valeur unique à partir de plusieurs lignes : combien de produits avez-vous ? Quel est le chiffre d'affaires total ? Quel est le prix moyen par catégorie ? Combinées avec GROUP BY, elles transforment des milliers de lignes de données brutes en quelques chiffres clés — ceux que les dirigeants utilisent pour prendre des décisions.

Sans agrégation, vous avez une liste de 200 commandes. Avec agrégation, vous avez "CA du mois : 1 250 000 FCFA, 45 commandes, panier moyen 27 778 FCFA". C'est la différence entre des données et de l'information.

Les 6 fonctions d'agrégation

  • COUNT(*) — nombre total de lignes. Compte TOUTES les lignes, y compris celles avec des NULL.
  • COUNT(colonne) — nombre de lignes NON NULL dans cette colonne. COUNT(compare_price) compte seulement les produits en promo.
  • COUNT(DISTINCT colonne) — nombre de valeurs UNIQUES. COUNT(DISTINCT city) = combien de villes différentes, pas combien de clients.
  • SUM(colonne) — somme. SUM(price * stock) = valeur totale du stock en FCFA. Ignore les NULL.
  • AVG(colonne) — moyenne. AVG(price) = prix moyen. Ignore les NULL (ne divise pas par les lignes NULL).
  • MIN(colonne) / MAX(colonne) — valeur minimale / maximale. Fonctionnent aussi sur les dates (MIN(created_at) = plus ancienne commande) et les textes (MIN(name) = premier alphabétiquement).

GROUP BY — regrouper et calculer par groupe

Sans GROUP BY, une fonction d'agrégation retourne UNE seule ligne pour toute la table. Avec GROUP BY, elle retourne UNE ligne par groupe.

SELECT category_id, COUNT(*) AS nb_produits, AVG(price) AS prix_moyen FROM products GROUP BY category_id;

Résultat : une ligne par catégorie. MySQL regroupe les produits par category_id et calcule COUNT et AVG pour chaque groupe.

Règle essentielle : dans un SELECT avec GROUP BY, chaque colonne doit être soit listée dans le GROUP BY, soit à l'intérieur d'une fonction d'agrégation. SELECT category_id, name, COUNT(*) est invalide parce que name n'est ni groupé ni agrégé — MySQL ne sait pas quel "name" choisir parmi les 5 produits du groupe.

Vous pouvez grouper par plusieurs colonnes : GROUP BY YEAR(created_at), MONTH(created_at) regroupe par mois.

HAVING — filtrer les groupes (pas les lignes)

WHERE filtre les lignes AVANT le regroupement. HAVING filtre les groupes APRÈS.

WHERE price > 10000 → élimine les produits individuels avant de grouper. HAVING AVG(price) > 10000 → élimine les GROUPES dont la moyenne est ≤ 10 000.

WHERE ne peut pas utiliser les fonctions d'agrégation (WHERE COUNT(*) > 3 est une erreur). HAVING peut. L'ordre dans la requête : SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT.