TD 10
EXERCICE 1
La station de ski « Ski Sympa » possède une base de données pour la gestion des opérations de
vente de forfait de ski. Cette base comporte les informations concernant les forfaits disponibles
et les forfaits vendus, ainsi que les informations sur les cartes de fidélités et les clients possédant
ces cartes. Le schéma de cette base de données est donné ci-dessous :
Type_Forfait (codefor, nomfor, prixfor, duree, conditions)
Forfait_Vendu (numfor, codefor, début, fin)
Carte_Fidel (numcarte, nomclient, adrclient, emailclient, datecarte)
Hist_Carte (numcarte, numfor, dateacq)
Exprimez les requêtes suivantes en SQL :
1.Combien de forfaits la station a vendu pour les vacances de Noël (du 20/12 au 02/01).
SELECT count(numfor)
FROM Forfait_Vendu F
WHERE F.début>=’20/12/2010’ and F.fin<= ‘02/01/2010’
2) Combien des forfaits la station a vendu pour les clients préférentiels pendant les vacances de Noël
(du 20/12 au 02/01).
SELECT count(numfor)
FROM Hist_Carte AS F
WHERE F.dateacq BETWEEN ‘20/12/2010’and ‘02/01/2010’
3) Les forfaits valables le jour de l’an avec leur type (codefor et nomfor), leur prix et leur période de
validité (début et fin).
SELECT T.codefor, T.nomfor, T.prix, F.début, F.fin
FROM Type_forfait AS T, Forfait_Vendu AS F
WHERE T.codefor=F.codefor and F.début <= ‘01/01/2021’ and F.fin>=’01/01/2021’
4) Les clients (numcarte) qui n’ont jamais acquis un forfait journée ou demi-journée.
SELECT C.numcarte
FROM Carte_Fidel AS C
WHERE C.numcarte NOT IN ( SELECT H.numcarte
FROM Hist_Carte H, Type_forfait T, Forfait_Vendu F
WHERE T.codefor=F.codefor and H.numfor=F.numfor and (T.nomfor=
"journée" or T.nomfor="demi-journée")
5) Les clients (nomclient) qui avaient un forfait valable à Nöel et au jour de l’an (pas forcément le même
forfait).
SELECT C.nomclient
FROM Carte_Fidel AS C, Forfait_Vendu AS F1, Hist_Carte AS H1, Forfait_Vendu AS F2, Hist_Carte AS H2
WHERE C.numcarte=F1.numcarte and H1.numfor=F1.numfor and F1.début <=’25/12/2010’and F1.fin
<=’25/12/2010’ and H2.numfor=F2.numfor and F2.début <=’01/01/2011’ and F2.fin <=’01/01/2011’
7) Les clients (nomclient, emailclient) qui ont toujours pris un forfait saison.
SELECT C.nomclient, C.emailclient
FROM Carte_Fidel AS C
WHERE C.numcarte NOT IN ( SELECT H.numcarte
FROM Hist_Carte AS H, Type_forfait AS T, Forfait_Vendu AS F
WHERE T.codefor=F.codefor and H.numfor=F.numfor and
T.nomfor<>"saison"
8) La durée moyenne, en nombre de jour, des forfaits offerts par la station.
SELECT avg(durée)
FROM Type_Forfait
9) Les forfaits vendus (toutes les informations sur les forfaits et leur type de forfait) dont la durée
réelle est supérieure à la durée moyenne des forfaits vendus.
SELECT T.*, F.*
FROM Forfait_Vendu as F, Type_Forfait AS T
WHERE (T.fin-T.debut)>= (SELECT avg(f2.fin-f2.debut) FROM Forfait_Vendu as f2)