110
Chapitre 5 • Le langage SQL DML
and
NPRO = 'PA45'
group by M.NCLI
having count(*) >= 2
Selon le même principe de groupement sur une jointure, la requête suivante établit
pour chaque client de Poitiers le montant total de ses commandes.
select 'Montant dû par ',C.NCLI,' = ',sum(QCOM*PRIX)
from
CLIENT C, COMMANDE M, DETAIL D, PRODUIT P
where LOCALITE = 'Poitiers'
and
M.NCLI = C.NCLI
and
M.NCOM = D.NCOM
and
D.NPRO = P.NPRO
group by M.NCLI
La clause group by NCLI devrait théoriquement autoriser la présence de NOM ou
CAT dans la clause select, puisque par construction à une même valeur de NCLI
correspondent toujours la même valeur de NOM et la même valeur de CAT. Il n’en
est malheureusement rien, la règle énoncée ci-dessus ne souffrant aucune exception,
aussi logique soit-elle. Si nous voulons voir apparaître ces données, alors nous
devons écrire group by M.NCLI,NOM,CAT. Pas très élégant, mais efficace !
La requête suivante calcule la quantité qui resterait en stock pour chaque produit
si on déduisait les quantités commandées. On observera la présence (en apparence
inutile) de QSTOCK dans le critère de groupement réclamée par son apparition dans
la clause select en dehors d’une fonction d’agrégation. On observera aussi que
seuls les produits effectivement commandés sont repris.
select P.NPRO, QSTOCK - sum(D.QCOM) as SOLDE
from
DETAIL D, PRODUIT P
where D.NPRO = P.NPRO
group by P.NPRO, QSTOCK
5.5.4 Composition du critère de groupement
Nous venons de le voir, le critère de groupement peut inclure plusieurs noms de
colonne. L’exemple supplémentaire ci-dessous calcule pour chaque groupe de
mêmes valeurs de LOCALITE et NPRO le montant total commandé.
select LOCALITE,P.NPRO,sum(QCOM*PRIX) as Montant
from
CLIENT C, COMMANDE M, DETAIL D, PRODUIT P
where M.NCLI = C.NCLI
NPRO
SOLDE
CS262
CS464
PA45
PA60
PH222
PS222
-15
-135
535
-1
690
620
Chapitre 5 • Le langage SQL DML
and
NPRO = 'PA45'
group by M.NCLI
having count(*) >= 2
Selon le même principe de groupement sur une jointure, la requête suivante établit
pour chaque client de Poitiers le montant total de ses commandes.
select 'Montant dû par ',C.NCLI,' = ',sum(QCOM*PRIX)
from
CLIENT C, COMMANDE M, DETAIL D, PRODUIT P
where LOCALITE = 'Poitiers'
and
M.NCLI = C.NCLI
and
M.NCOM = D.NCOM
and
D.NPRO = P.NPRO
group by M.NCLI
La clause group by NCLI devrait théoriquement autoriser la présence de NOM ou
CAT dans la clause select, puisque par construction à une même valeur de NCLI
correspondent toujours la même valeur de NOM et la même valeur de CAT. Il n’en
est malheureusement rien, la règle énoncée ci-dessus ne souffrant aucune exception,
aussi logique soit-elle. Si nous voulons voir apparaître ces données, alors nous
devons écrire group by M.NCLI,NOM,CAT. Pas très élégant, mais efficace !
La requête suivante calcule la quantité qui resterait en stock pour chaque produit
si on déduisait les quantités commandées. On observera la présence (en apparence
inutile) de QSTOCK dans le critère de groupement réclamée par son apparition dans
la clause select en dehors d’une fonction d’agrégation. On observera aussi que
seuls les produits effectivement commandés sont repris.
select P.NPRO, QSTOCK - sum(D.QCOM) as SOLDE
from
DETAIL D, PRODUIT P
where D.NPRO = P.NPRO
group by P.NPRO, QSTOCK
5.5.4 Composition du critère de groupement
Nous venons de le voir, le critère de groupement peut inclure plusieurs noms de
colonne. L’exemple supplémentaire ci-dessous calcule pour chaque groupe de
mêmes valeurs de LOCALITE et NPRO le montant total commandé.
select LOCALITE,P.NPRO,sum(QCOM*PRIX) as Montant
from
CLIENT C, COMMANDE M, DETAIL D, PRODUIT P
where M.NCLI = C.NCLI
NPRO
SOLDE
CS262
CS464
PA45
PA60
PH222
PS222
-15
-135
535
-1
690
620
