5.5 Extraction de données groupées
111
© Dunod – La photocopie non autorisée est un délit.
and
M.NCOM = D.NCOM
and
D.NPRO = P.NPRO
group by LOCALITE, P.NPRO
L’ordre des composants est indifférent : group by P.NPRO, LOCALITE donnerait
le même résultat.
Le critère de groupement peut aussi inclure une expression de calcul quelconque.
La requête suivante constitue des groupes de clients selon la première lettre de leur
valeur de CAT.
select substring(CAT from 1 for 1) as CAT, count(*) as N
from
CLIENT
group by substring(CAT from 1 for 1)
Il est évident que certains critères de groupement sont plus pertinents que d’autres.
Par exemple, un groupement sur les valeurs COMPTE serait sans intérêt. En
revanche, il serait très intéressant de regrouper les clients selon leurs valeurs de
COMPTE par intervalles de 1.000, comme dans la requête ci-dessous.
select "de ", int(COMPTE/1000)*1000 as Min,
" à ", int(COMPTE/1000)*1000 + 999 as Max,
count(*) as N
from
CLIENT C
group by int(COMPTE/1000)
5.5.5 Attention aux groupements multi-niveaux
L’extraction de données groupées est à définir avec précaution en présence de jointures. Cherchons par exemple à déterminer, pour chaque localité, la somme des
comptes des clients et le nombre de commandes. On serait tenté d’écrire :
select LOCALITE, sum(COMPTE), count(*)
from
CLIENT C, COMMANDE M
where C.NCLI = M.NCLI
group by LOCALITE
CAT
N
B
C
2
8
6
de
Min
à
Max
N
de
de
de
de
de
de
de
-9000
-5000
-4000
-3000
-2000
0
1000
à
à
à
à
à
à
à
-8001
-4001
-3001
-2001
-1001
999
1999
1
1
1
2
1
9
1
Précédent

- 111/436

Suivant