Questions avancées en SQL
A la fin de chaque année, le service marketing établit un ensemble d'états qui permettent d'analyser le profil de leurs clients (leurs préférences, leur pouvoir d'achat, etc.) et d'ajuster l'offre de l'association en conséquence.
Question
Écrivez une requête SQL LMD pour calculer pour chaque produit, le nombre d'articles vendus, trié par ordre décroissant.
Indice
Utilisez la fonction SUM appliquée à la quantité sum(t.qte)
, la clause GROUP BY pour faire les calculs par produit, et la clause ORDER BY pour le tri.
Solution
select p.num, p.designation, sum(lf.qte) as nb
from produit p, ligne_fact lf
where lf.produit=p.num
group by p.num, p.designation
order by nb desc;
Question
Ecrivez une requête SQL LMD pour calculer les chiffres d'affaire par client, triés par ordre décroissant.
Indice
Utilisez la fonction SUM appliquée au produit du prix et de la quantité (sum(t1.prix*t2.qte)
), la clause GROUP BY pour faire les calculs par client, et la clause ORDER BY pour le tri.
Solution
select c.num, c.nom, c.prenom, sum(p.prix*lf.qte)
from client c, produit p, facture f, ligne_fact lf
where p.num=lf.produit
and lf.facture=f.num
and f.client=c.num
group by c.num, c.nom, c.prenom
order by sum(p.prix*lf.qte) DESC;
Question
Ecrivez une requête SQL LMD pour calculer le montant moyen des factures pour chaque client, trié par ordre croissant.
Indice
Vous pouvez utiliser les sous-requêtes dans la clause FROM pour traiter la question en deux étapes.
Solution
select client, avg(montant) moy
from (
select c.num as client, f.num, sum(lf.qte*p.prix) as montant
from facture f, ligne_fact lf, client c, produit p
where lf.facture=f.num and lf.produit=p.num and f.client=c.num
group by c.num, f.num
)
group by client
order by moy;
Question
Écrivez deux requêtes SQL LMD pour obtenir la liste des produits dont le prix est maximal et dont le prix est minimal.
Indice
Utilisez une sous-requête d'existence de type IN.
Solution
select distinct designation "PRIX MAX"
from produit
where prix in (select max(prix) from produit);
select distinct designation "PRIX MIN"
from produit
where prix in (select min(prix) from produit);