Vue
[20 min]
Le service après vente (SAV) est instruit à se comporter vis à vis des clients, selon leur catégorie :
"VIP" si le chiffre d'affaire pour ce client est supérieur à 500 euros,
"client ordinaire" si le chiffre d'affaire est compris entre 50 et 500 euros,
et "client à potentiel" si le chiffre d'affaire est inférieur à 50 euros.
Le mécanisme de vue est fréquemment utilisé pour masquer la complexité d'un schéma de BD aux yeux d'opérateurs nécessitant un schéma simple (on parle de schéma externe).
Dans notre cas, les opérateurs du SAV désirent avoir la catégorie du client au téléphone grâce à une instruction très simple :
select * from v_chiffre_affaire where code_client=# ;
Question
Écrivez la requête SQL LMD qui permet de renvoyer la liste des clients (num, nom et prénom) avec leur chiffre d'affaire et leur catégorie (VIP, Ordinaire ou Potentiel)
Indice
Utiliser l'extension SQL CASE WHEN
d'Oracle :
SELECT CASE WHEN ... THEN 'X' WHEN ... THEN 'Y' ELSE 'Z' END FROM ...
Solution
SELECT c.num, c.nom, c.prenom, sum(p.prix*lf.qte) chiffre_affaire,
CASE
WHEN sum(p.prix*lf.qte)>500 THEN 'VIP'
WHEN sum(p.prix*lf.qte) BETWEEN 50 AND 500 THEN 'Ordinaire'
ELSE 'Potentiel'
END categorie
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;
Question
Écrivez la requête SQL LDD qui crée la vue "v_chiffre_affaire" permettant de répondre au besoin des opérateurs du service après vente.
Solution
CREATE VIEW v_chiffre_affaire AS
SELECT c.num, c.nom, c.prenom, sum(p.prix*lf.qte) chiffre_affaire,
CASE
WHEN sum(p.prix*lf.qte)>500 THEN 'VIP'
WHEN sum(p.prix*lf.qte) BETWEEN 50 AND 500 THEN 'Ordinaire'
ELSE 'Potentiel'
END categorie
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;