Aller au contenu principal

Agrégations

Progression

#Agrégations

Les agrégations résument des ensembles de lignes: COUNT, SUM, AVG, MIN, MAX. GROUP BY forme des groupes; HAVING filtre après agrégation. Comprendre la différence entre WHERE et HAVING et l’effet de NULL évite des surprises.

sqlsql
1select count(*) as n from users;

Par groupe:

sqlsql
1create table orders(id int, user_id int, amount real);2insert into orders values (1,1,19.9),(2,1,5.0),(3,2,12.0);3select user_id, count(*) as n, sum(amount) as total4from orders5group by user_id6having total > 10;

#Animation: pipeline d’agrégation

FROM/WHERE
Sélection des lignes
GROUP BY
Former des groupes
Aggregats
COUNT/SUM/AVG… par groupe
HAVING
Filtrer après agrégats
SELECT/ORDER
Projeter et trier

#Concepts clés

  • WHERE vs HAVING: WHERE filtre les lignes avant agrégation; HAVING filtre des groupes après calcul des agrégats.
  • NULL et agrégats: COUNT(col) ignore les NULL; SUM/AVG ignorent aussi les NULL. COUNT(*) compte toutes les lignes, NULL inclus.
  • Colonnes du SELECT: en présence de GROUP BY, seules les colonnes agrégées ou présentes dans GROUP BY sont permises (ou dépendantes fonctionnellement selon le moteur).
  • Window functions: permettent des agrégats par “fenêtre” sans regrouper en une ligne (ex.: somme cumulée) — différents de GROUP BY.
Piège courant: colonnes non groupées

SELECT a, SUM(x) FROM t GROUP BY a est valide; SELECT a, b, SUM(x) FROM t GROUP BY a ne l’est pas (sauf extensions). Si vous avez besoin de b, il doit être agrégé, groupé, ou déterminé par une sous‑requête/CTE jointe.

Rollup/Cube (aperçu)

Des extensions comme ROLLUP/CUBE produisent des totaux intermédiaires et toutes les combinaisons de regroupement pour des rapports multi‑axes.

#Playground

Chargement de l’éditeur...

#Exercice : Agrégations avancées avec window functions

Implémentez des requêtes SQL utilisant des fonctions d'agrégation avancées pour analyser les données de commandes.

#Instructions

  1. Utilisez des window functions pour calculer des agrégats sans GROUP BY.
  2. Calculez le total cumulé des commandes par utilisateur.
  3. Trouvez le classement des commandes par montant dans chaque groupe d'utilisateurs.
  4. Calculez la moyenne mobile sur les 3 dernières commandes.

#Exemple de requête

sqlsql
1-- Création des tables de démonstration2create table users(id int, name text);3create table orders(id int, user_id int, amount real, order_date date);4 5-- Insertion de données6insert into users values (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');7insert into orders values 8(1, 1, 100.0, '2023-01-01'),9(2, 1, 150.0, '2023-01-02'),10(3, 2, 200.0, '2023-01-03'),11(4, 1, 75.0, '2023-01-04'),12(5, 2, 300.0, '2023-01-05'),13(6, 3, 50.0, '2023-01-06');14 
Chargement de l’éditeur...