Nom : Prénom : Page 1 Université Pierre et Marie Curie Paris 6 BDWA EXAMEN - 27 MARS 2006 Documents autorisés Master d'informatique Exercice 1. Requêtes décisionnelles On considère une base de données de schéma S suivant : CLIENTS (id_client, nom_client, id_pays) PAYS (id_pays, nom_pays, region) PRODUITS (id_prod, nom_prod, description, categorie) TEMPS(id_temps, jour, annee, mois) VENTES (id_prod, id_client, id_temps, quantité_vendue, montant_ventes) 7 pts Question 1. Définissez une vue V1 (Pays, Produit, MeilleureAnnee) sur le schéma S, donnant, par pays et par produit, l année où les ventes ont été les meilleures pour ce produit dans ce pays. CREATE VIEW V1 AS SELECT DISTINCT nom_pays Pays, nom_prod Produit, annee MeilleureAnnee FROM VENTES V, TEMPS T, PRODUITS P, CLIENTS C, PAYS Pa WHERE V.id_prod= P.id_prod AND V.id_temps = T.id_temps AND V.id_client = C.id_client AND C.id_pays = Pa.id_pays AND Montant_ventes = ( SELECT MAX(montant_ventes) FROM VENTES V1, TEMPS T1, PRODUITS P1, CLIENTS C1, PAYS Pa1 WHERE V1.id_prod= P1.id_prod AND V1.id_temps = T1.id_temps AND V1.id_client = C1.id_client AND C1.id_pays = Pa1.id_pays AND Pa.id_pays = Pa1.id_pays AND P.id_prod = P1.id_prod ) Question 2. Définissez une vue V2 (Pays, Produit, Annee, Ventes) sur le schéma S, donnant la somme des ventes par pays, par produit, et par année. CREATE VIEW V2 AS SELECT DISTINCT nom_pays Pays, nom_prod Produit, annee Annee, SUM(montant_ventes) Ventes FROM VENTES V, TEMPS T, PRODUITS P, CLIENTS C, PAYS Pa WHERE V.id_prod= P.id_prod AND V.id_temps = T.id_temps AND V.id_client = C.id_client AND C.id_pays = Pa.id_pays GROUP BY nom_pays, nom_prod, annee Question 3. Ecrivez une requête R1 sur la vue V2 en utilisant une fonction analytique permettant de calculer la somme des ventes des 5 dernières années (année en cours incluse) par pays, produit et année. prompt R1 somme des ventes par pays, produit et année sur les 5 dernières années prompt solution avec fenetre glissante select pays, produit, annee, sum(ventes) over (partition by pays, produit order by annee range between 4 preceding and current row) as somme5ans from V2 order by pays, produit, annee
Nom : Prénom : Page 2 prompt solution avec requete imbriquée select pays, produit, annee, ( select sum(ventes) from v2 b where a.pays = b.pays and a.produit = b.produit and b.annee between (a.annee - 4) and a.annee ) somme5ans from V2 a group by pays, produit, annee order by pays, produit, annee prompt solution avec jointure select a.pays, a.produit, a.annee, sum(b.ventes) as somme5ans from V2 a, V2 b where a.pays = b.pays and a.produit = b.produit and b.annee between (a.annee - 4) and a.annee group by a.pays, a.produit, a.annee order by a.pays, a.produit, a.annee prompt solution erronée : la somme ne se limite pas à un produit et une année : select pays, produit, annee, sum(ventes) over (order by annee range between 4 preceding and current row) as somme5ans from V2 order by pays, produit, annee Question 4. Définissez une vue V3, donnant la somme des ventes par pays, produit, année et l année où les ventes ont été les meilleures pour ce produit dans ce pays. CREATE VIEW V3 AS SELECT V1.Pays, v1.produit, Annee, Ventes, MeilleureAnnee FROM V1, V2 WHERE V1.Pays = V2.Pays AND V1.Produit=V2.Produit Question 5. Ecrivez la requête SQL sur la vue V2, qui permet de construire un tableau contenant, pour l Italie et pour la France, les ventes de chaque produit par année, en respectant les règles suivantes : Les ventes de livres en 2004 sont de 1000. En 2005, les ventes de livres sont la somme des ventes de livres en 2003 et 2004. Les ventes de disques en 2005 sont les mêmes qu en 2004. Ce tableau contient des données extraites de la vue et des données calculées. Un exemple de tableau montrant un résultat de cette requête est donné ci-dessous : PAYS PRODUIT ANNEE VENTES Italie Livre 2001 1000 Italie Livre 2002 5333 Italie Disque 2002 81500 France Livre 2001 1000 France Livre 2002 6130
Nom : Prénom : Page 3 France Disque 2002 89700 Requete R2 SELECT SUBSTR(pays,1,20) country, SUBSTR(produit,1,15) product, annee, ventes FROM V2 WHERE pays in ('Italie', 'France') MODEL RETURN UPDATED ROWS MAIN simple_model PARTITION BY (pays) DIMENSION BY (produit, annee) MEASURES (ventes) RULES (ventes['livre', 2004] = 1000, ventes['livre', 2005] = ventes['livre', 2004] + ventes['livre', 2003], ventes['disque', 2005] = ventes['disque', 2004]) ORDER BY pays, produit, annee Complément de l exercice, à faire éventuellement en TD : CREATE VIEW sales_view AS SELECT country_name country, prod_name product, calendar_year year, SUM(amount_sold) sales, COUNT(amount_sold) cnt, MAX(calendar_year) KEEP (DENSE_RANK FIRST ORDER BY SUM(amount_sold) DESC) OVER (PARTITION BY country_name, prod_name) best_year, MAX(calendar_year) KEEP (DENSE_RANK LAST ORDER BY SUM(amount_sold) DESC) OVER (PARTITION BY country_name, prod_name) worst_year FROM sales, times, customers, countries, products WHERE sales.time_id = times.time_id AND sales.prod_id = products.prod_id AND sales.cust_id =customers.cust_id AND customers.country_id=countries.country_id GROUP BY country_name, prod_name, calendar_year Cette requete utilise les fonctions analytiques FIRST et LAST, et permet de Calculer la somme et le nombre de ventes, regroupées par pays, produit, et année. Pour chaque produit vendu dans un pays, on aura l année où les ventes ont été meilleures pour ce produit dans ce pays. C est l attribut best_year. L année où les ventes pour ce produit ont été les pires est donnée dans worst_year. Exercice 2 : OLAP : Agrégation, Modèle, Cube Soit S1 le schéma relationnel suivant: Personne (nss, nom, age, étude) nss est le n de sécurité sociale étude est le niveau d étude d une personne Entreprise (ne, nom, ville, activité) ne est l identifiant de l entreprise Emploi (nss, ne, salaire) L employé nss a un emploi rémunéré dans l entreprise ne Remarque: la clé de chaque relation est soulignée 7 pts Question 1 Une personne peut occuper plusieurs emplois, pendant sa carrière, dans une ou plusieurs entreprises avec des salaires éventuellement différents. Soit nbemp le nombre d emplois d une personne. Ecrire en SQL la requête R1 qui donne le salaire moyen pour chaque nombre d emplois différents? Par exemple, si la base de données contient des personnes qui ont eu 1, 2, 4 ou 5 emplois, le résultat de la requête R1 est :
Nom : Prénom : Page 4 nbemp salaire_moyen ------------------- 1 2102 2 1511 4 2312 5 5312 Ex : 1511 est le salaire moyen de tous les emplois des personnes qui ont eu exactement 2 emplois dans leur carrière. select nbemp, avg(salaire_moyen) as salaire_moyen from ( select count(*) as nbemp, avg(salaire) as salaire_moyen from emploi group by nss) group by nbemp Ici on a un cas particulier : la moyenne des salaires moyens pour une valeur donnée de nbemp est égale à la moyenne des salaires des personnes concernées. Par exemple pour nbemp = 2, on a ((s11 + s12)/2 + (s21 + s22 )/2)/ 2 = (s11+ s12 + s21+ s22) /4 Ceci se vérifie car on effectue la moyenne des salaires moyens d un même nbemp. Attention : en général la moyenne n est pas distributive Par exemple pour nbemp = 3 et nbemp=1 ((S11+ s12 + S13)/3 + s21) /2 (s11 + s12 + s13 + s21) /4 Question 2 a) Ecrire en SQL une requête R2 qui donne, pour chaque niveau d étude, la moyenne des salaires des personnes qui ont ce niveau d étude. Le résultat de la requête a le schéma : R2(etude, salaire_moyen) prompt moyenne des salaires des personnes ayant le même niveau d'etude select etude, avg(salaire) as salaire_moyen from Emploi e, Personne p where e.nss = p.nss b) Le salaire moyen d une personne est la moyenne des salaires perçus pendant sa carrière. Ecrire en SQL une requête R3 qui donne, pour chaque niveau d étude, la moyenne du salaire moyen des personnes qui ont ce niveau d étude. Le schéma de la requête R3(etude, salaire_moyen). prompt moyenne des salaires MOYENS de chaque personne regroupés par niveau d'etude: select etude, avg(salaire_moyen) as salaire_moyen from ( select etude, avg(salaire) as salaire_moyen from Emploi e, Personne p where e.nss = p.nss group by p.nss, etude
Nom : Prénom : Page 5 ) prompt autre solution avec un group by en moins (mais une requete imbriquée en plus) select etude, avg(salaire_moyen) as salaire_moyen from ( select etude, (select avg(salaire) from Emploi where nss = p.nss) as salaire_moyen from Personne p ) prompt autre solution avec un IN select etude, avg(salaire_moyen) as salaire_moyen from ( select etude, salaire_moyen ) from Personne p, ( select nss, avg(salaire) as salaire_moyen where p.nss = a.nss from Emploi group by nss) a c) R2 et R3 sont elles équivalentes? Justifier Non la moyenne n est pas distributive Question 3 On dispose d un outil OLAP pour analyser les salaires selon l âge et le niveau d étude des personnes et la situation géographique des entreprises. L analyse selon l âge peut se faire par année ou par décade (tranches de 10 années à partir de 14 ans et jusqu à 73 ans). L analyse du niveau d étude peut se faire par le niveau d enseignement atteint en fin d études (primaire, secondaire, supérieur) ou par le dernier diplôme obtenu (certificat de fin d étude primaire, BEPC, Bac, Licence, Master). L analyse de la situation géographique peut se faire par ville, département, région ou pays. Tenir compte de l existence éventuelle de villes synonymes dans plusieurs régions ou pays Quel est le schéma relationnel en étoile le plus approprié pour cette analyse? Pour chaque relation, donner son nom et ceux de ses attributs, souligner les attributs de la clé. Rmq : Nommer un attribut clé étrangère avec le même nom que l attribut clé correspondant. Table de fait : Salarié(age, diplôme, nv, salaire) Dimensions :
Nom : Prénom : Page 6 Age (age, décade) L attribut Age.age est un nombre un nombre d année, l attribut Age.décade est un n de décade, par exemple int( (age-4) /10 ) Etude (diplôme, enseignement) Ville(nv, ville, département, région, pays) Compléter le schéma précédent pour pouvoir analyser les salaires - selon les tranches d âge suivantes {mineurs, jeunes de 18 à 25 ans, actifs de 26 à 65 ans, plus de 65 ans}, en plus des tranches préalablement définies. - le type d enseignement suivi : généraliste, professionnel ou mixte - l aspect maritime du département où travaille la personne (avec ou sans front de mer) Le schéma obtenu est il en étoile, flocon ou constellation? Le nom du diplôme ne permet pas de déduire su l enseignement est pro ou généraliste. C est pourquoi on remplace le nom de diplôme par un attribut numéro de diplôme ndipl. Table de fait : Salarié(age, ndipl, nv, salaire) Chaque décade n est pas incluse dans une seule tranche, donc les tranches ne sont pas un niveau supérieur au dessus des décades. La dimension année a deux branches AgeDécade (année, décade) AgeTranche(année, tranche) Etude (ndipl, diplôme, enseignement) Etude (ndipl, type) Ville (nv, ville, département, région, pays) Ville (département, maritime) Schéma en flocon : une seule table de fait, les dimensions ont plusieurs branches Question 4 On utilise la fonction moyenne (average) pour agréger les mesures lors des opérations de rollup et de projection agrégative. Soit C1 le cube qui présente les salaires moyens suivant les dimensions : décade, diplôme, département. Quelles sont, dans l ordre, les opérations à appliquer sur C1 pour obtenir les cubes suivants? Répondre en donnant pour chaque opération, son nom suivi d une brève description. C2 présente, pour chaque région et chaque diplôme, le salaire moyen des personnes de plus de 24 ans, qui ont perçu au moins une fois dans leur carrière un salaire supérieur à 1000, et qui ont quitté l université avec une licence. C2 Nom de l opération 1 :... description :... Nom de l opération 2 :... description :...
Nom : Prénom : Page 7 1 dice avec prédicat sal >1000 2 projection sur les décades : de la 2 ème à la nième décade 3 projection agrégative des décades restantes 4 slice sur la dimension du niveau d étude : licence 5 Rollup : département région C3 contient, pour chaque ville, le salaire moyen des personnes de 65 ans Nom de l opération 1 :... description :... Nom de l opération 2 :... description :...... 1 drill down : décade age 2 slice sur l age = 65 3 drill down department ville 4 projection agrégative sur le niveau d etude