Les deux premières lignes correspondent aux nombres de chats mâles et femelles. Jusque-là, rien de nouveau. Par contre, la
troisième ligne est une ligne insérée par WITH ROLLUP, et contient le nombre de chats (mâles et femelles). Nous avons fait des
groupes en séparant les espèces et les sexes, et WITH ROLLUP a créé des "super-groupes" en regroupant les sexes mais
gardant les espèces séparées.
Nous avons donc également le nombre de chiens à la sixième ligne, de perroquets à la neuvième, et de tortues à la douzième.
Quant à la toute dernière ligne, c'est un "super-super-groupe" qui réunit tous les groupes ensemble.
C'est en utilisant WITH ROLLUP qu'on se rend compte que l'ordre des critères est vraiment important. En effet, voyons ce qui
se passe si on échange les deux critères nom_courant et sexe.
Code : SQL
SELECT nom_courant, sexe, COUNT(*) as nb_animaux
FROM Animal
INNER JOIN Espece ON Espece.id = Animal.espece_id
WHERE sexe IS NOT NULL
GROUP BY sexe, nom_courant WITH ROLLUP;
nom_courant
sexe nb_animaux
Chat
F
9
Chien
F
11
Perroquet amazone F
1
Tortue d'Hermann F
10
NULL
F
31
Chat
M
9
Chien
M
10
Perroquet amazone M
3
Tortue d'Hermann M
4
NULL
M
26
NULL
NULL 57
Cette fois-ci, les super-groupes ne correspondent pas aux espèces, mais aux sexes, c'est-à-dire au premier critère. Le
regroupement se fait bien dans l'ordre donné par les critères.
J'ai ajouté la condition WHERE sexe IS NOT NULL pour des raisons de lisibilité uniquement, étant donné que
sans cette condition, d'autres NULL seraient apparus, rendant plus compliquée l'explication des super-agrégats.
NULL, c'est pas joli
Il est possible d'éviter d'avoir ces NULL dans les lignes des super-groupes. Pour cela, on peut utiliser la fonction COALESCE().
Cette fonction prend autant de paramètres que l'on veut, et renvoie le premier paramètre non NULL.
Exemples :
Code : SQL
SELECT COALESCE(1, NULL, 3, 4); -- 1
SELECT COALESCE(NULL, 2);
-- 2
SELECT COALESCE(NULL, NULL, 3); -- 3
Partie 3 : Fonctions : nombres, chaînes et agrégats
184/414
www.openclassrooms.com
Précédent

- 184/413

Suivant