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 dansGROUP 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
- Utilisez des window functions pour calculer des agrégats sans GROUP BY.
- Calculez le total cumulé des commandes par utilisateur.
- Trouvez le classement des commandes par montant dans chaque groupe d'utilisateurs.
- 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...