Exercice supplémentaire : Gestion des ventes
Une société veut modéliser son système de gestion des ventes, pour cela elle élabore le modèle relationnel suivant :
- Client (clt_num, clt_nom, clt_prenom, clt_pays, clt_loc, clt_type)
- Commandes (cmd_num, cmd_date, #clt_num, #mag_num)
- Magasin (mag_num, mag_loc, mag_gerant)
- Ligne_cmd (#cmd_num, #art_num, lcd_qte, lcd_liv, lcd_pu, lcd_date_liv)
- Article (art_num, art_nom, art_poids, art_stock, art_pa, art_pv, #art_four)
Une fois le modèle relationnel implémenté, l'administrateur de la base de données souhaite récupérer certaines informations à l'aide du langage SQL.
Gestion des ventes
Écrire les requêtes SQL pour récupérer les informations suivantes :
- Donner le numéro des articles vendus, avec pour chacun le prix moyen de vente et le nombre de ventes.
- Donner par magasin les statistiques de vente en 2019, à savoir le nombre de ventes, le nombre de clients différents, et le nombre de jours où il y a eu des ventes.
- Donner les numéros des clients qui ont acheté plus d'une fois dans la semaine du 6 au 10 juin.
- Donner pour les années 2017 à 2019, le nombre de clients différents sur une année tous magasins confondus.
- Classer les localités en fonction du nombre décroissant de clients qui y habitent.
- Donner le numéro et la date d'achat des clients n'ayant acheté qu'une fois.
- Donner la liste des clients qui n'ont pas encore acheté des articles.
- Donner le numéro des articles dont la moyenne des quantités vendues est supérieure à la moyenne des quantités vendues en une fois tous articles confondus.
- Donner le numéro et le nom des articles qui ont été vendus à un prix de vente unitaire supérieur au prix de vente dans le catalogue.
- Numéro des articles vendus, prix moyen de vente et nombre de ventes :
SELECT art_num, AVG(lcd_pu) as PrixMoyen, COUNT(*) as NbVentes FROM Ligne_cmd GROUP BY art_num; - Statistiques de vente par magasin en 2019 :
SELECT C.mag_num, COUNT(*) as "Nombre de ventes", COUNT(DISTINCT C.clt_num) as "Nombre de clients", COUNT(DISTINCT C.cmd_date) as "Nombre de jours" FROM Commandes C WHERE YEAR(C.cmd_date) = 2019 GROUP BY C.mag_num; - Clients ayant acheté plus d'une fois du 6 au 10 juin :
SELECT clt_num FROM Commandes WHERE cmd_date BETWEEN '2019-06-06' AND '2019-06-10' GROUP BY clt_num HAVING COUNT(*) > 1;Note: L'année n'est pas précisée dans l'énoncé, on suppose 2019.
- Nombre de clients différents par année (2017-2019) :
SELECT YEAR(cmd_date) as Annee, COUNT(DISTINCT clt_num) as NbClients FROM Commandes WHERE YEAR(cmd_date) BETWEEN 2017 AND 2019 GROUP BY YEAR(cmd_date); - Classement des localités par nombre de clients :
SELECT clt_loc, COUNT(*) as NbClients FROM Client GROUP BY clt_loc ORDER BY NbClients DESC; - Numéro et date d'achat des clients n'ayant acheté qu'une fois :
SELECT cmd_num, cmd_date FROM Commandes WHERE clt_num IN ( SELECT clt_num FROM Commandes GROUP BY clt_num HAVING COUNT(*) = 1 ); - Clients qui n'ont pas encore acheté d'articles :
SELECT * FROM Client WHERE clt_num NOT IN ( SELECT DISTINCT clt_num FROM Commandes ); - Articles dont la moyenne des quantités vendues est supérieure à la moyenne générale :
SELECT art_num FROM Ligne_cmd GROUP BY art_num HAVING AVG(lcd_qte) > ( SELECT AVG(lcd_qte) FROM Ligne_cmd ); - Articles vendus à un prix supérieur au prix catalogue :
SELECT A.art_num, A.art_nom FROM Article AS A JOIN Ligne_cmd AS L ON A.art_num = L.art_num WHERE L.lcd_pu > A.art_pv GROUP BY A.art_num, A.art_nom;Note: Correction de la faute de frappe (lct_pu → lcd_pu).
- SELECT avec agrégation : COUNT, AVG, SUM
- GROUP BY : pour regrouper par article, magasin, client, localité
- HAVING : pour filtrer sur les résultats d'agrégation (COUNT > 1, AVG > moyenne générale)
- Sous-requêtes : IN, comparaison avec agrégats
- Fonctions de date : YEAR, BETWEEN
- Jointures : INNER JOIN entre Article et Ligne_cmd
- DISTINCT : pour compter les clients uniques, les jours de vente
- ORDER BY : pour classer les localités
- NOT IN : pour trouver les clients sans commande
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.