BD51 BUSINESS INTELLIGENCE & DATA WAREHOUSE



Documents pareils
Département Génie Informatique

TP2 DE BUSINESS INTELLIGENCE ISIMA ZZ3 F3

TP2_1 DE BUSINESS INTELLIGENCE ISIMA ZZ3 F3

CATALOGUE DE FORMATIONS BUSINESS INTELLIGENCE. Edition 2012

Compétences Business Objects

Construction d un EDD avec SQL 2008 R2. D. Ploix - M2 Miage - EDD - Création

Exploiter les statistiques d utilisation de SQL Server 2008 R2 Reporting Services

SQL Server 2012 Implémentation d'une solution de Business Intelligence (Sql Server, Analysis Services...)

Introduction à la B.I. Avec SQL Server 2008

Travail de diplôme 2011 Business Intelligence Open Source SpagoBI/Talend Résumé

SQL SERVER 2008, BUSINESS INTELLIGENCE

Création et Gestion des tables

HERMES SYSTEM et BEWISE souhaitent vous offrir les meilleures compétences.

2 Serveurs OLAP et introduction au Data Mining

Cours de SQL SERVER 2005 SQL SERVER 2005

Business Intelligence avec SQL Server 2012

Master Exploration Informatique des données DataWareHouse

Encryptions, compression et partitionnement des données

Thibault Denizet. Introduction à SSIS

SQL Historique

CATALOGUE DE FORMATIONS BUSINESS INTELLIGENCE. Edition 2014

Business Intelligence avec Excel, Power BI et Office 365

BUSINESS INTELLIGENCE. Une vision cockpit : utilité et apport pour l'entreprise

Le "tout fichier" Le besoin de centraliser les traitements des fichiers. Maitriser les bases de données. Historique

Business Intelligence avec SQL Server 2012

Bases de Données Avancées

BIRT (Business Intelligence and Reporting Tools)

Bases de données relationnelles

Olivier Mondet

CREATION WEB DYNAMIQUE

MYXTRACTION La Business Intelligence en temps réel

Devoir Data WareHouse

SQL Server SQL Server Implémentation d une solution. Implémentation d une solution de Business Intelligence.

QU EST-CE QUE LE DECISIONNEL?

Catalogue Formation «Vanilla»

L INTELLIGENCE D AFFAIRE DANS LA VIE QUOTIDIENNE D UNE ENTREPRISE

palais des congrès Paris 7, 8 et 9 février 2012

SQL Server Installation Center et SQL Server Management Studio

Fournir un accès rapide à nos données : agréger au préalable nos données permet de faire nos requêtes beaucoup plus rapidement

Business Intelligence

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Présentation Windows Azure Hadoop Big Data - BI

Introduction aux outils BI de SQL Server Tutoriel sur SQL Server Integration Services (SSIS)

Business Intelligence avec SQL Server 2012 Maîtrisez les concepts et réalisez un système décisionnel

KPI (Key Performance Indicator) dans MOSS

Nos Solutions PME VIPDev sont les Atouts Business de votre entreprise.

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

TP Contraintes - Triggers

NFA 008. Introduction à NoSQL et MongoDB 25/05/2013

Documentation d information technique spécifique Education. PGI Open Line PRO

Business Intelligence avec SQL Server 2014 Maîtrisez les concepts et réalisez un système décisionnel

Les journées SQL Server 2013

BUSINESS INTELLIGENCE

La problématique. La philosophie ' ) * )

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Installation de SQL Server Reporting Services avec l intégration dans un site Windows SharePoint Services V3

SQL Server administration SERVEUR DE BASES DE DONNEES OLIVIER D.

Magasins et entrepôts de données (Datamart, data warehouse) Approche relationnelle pour l'analyse des données en ligne (ROLAP)

La Geo-Business Intelligence selon GALIGEO avec 26/10/2005 1

Easy to. report. Connexion. Transformation. Stockage. Construction. Exploitation. Diffusion

1 Introduction et installation

Table des matières 1 DISASTER RECOVERY SAUVEGARDER RESTAURER BASE DE DONNÉS "SUSPECT"... 28

Suite Jedox La Business-Driven Intelligence avec Jedox

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Bases de Données relationnelles et leurs systèmes de Gestion

Chapitre 1 Introduction

L Edition Pilotée XL

Les bases de données

Accélérateur de votre RÉUSSITE

Oracle Décisionnel : Modèle OLAP et Vue matérialisée D BILEK

Architecture de la plateforme SBC

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Gestion de base de données

INTRODUCTION AUX TESTS DE PERFORMANCE ET DE CHARGE

SWISS ORACLE US ER GRO UP. Newsletter 5/2014 Sonderausgabe. OBIF DB licensing with VMware Delphix 12c: SQL Plan / Security Features

Urbanisation des SI-NFE107

Sauvegarde et Restauration d un environnement SAS

Sage 100 CRM Guide de l Import Plus avec Talend Version 8. Mise à jour : 2015 version 8

Solutions SAP Crystal

Analyse comparative entre différents outils de BI (Business Intelligence) :

La base de données dans ArtemiS SUITE

INSTALLATION DE L APPLICATION DU CONTEXTE ITASTE

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

Formations QlikView / Business Intelligence

Q.U.I.D QUALITÉ ET URBANISATION DE L'INFORMATION DÉCISIONNELLE. Tom BIZET & Stéphane SITBON 2008

Installation de SCCM 2012 (v2)

LES NOUVEAUTES DE COST AND PROFITABILITY MANAGEMENT 8.1

MODE OPERATOIRE CORIM PROGRESS / SECTION MEI. Exploitation Informatique

Business Intelligence

SAP BO Mobile SAP BI Septembre /09/2014 Integrated Business intelligence 1

Créer un rapport pour Reporting Services

Bases de Données OLAP

Sage FRP Treasury Universe Edition Module Cash L expert en gestion de trésorerie et flux financiers

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

Formateur : Caroline CHAILLET Cours 4740A - Implémentation d'une base de données Microsoft SQL Server /134

Adonya Sarl Organisme de Formation Professionnelle 75 Avenue Niel PARIS, France

Transcription:

BD51 BUSINESS INTELLIGENCE & DATA WAREHOUSE Document de synthèse de projet Développement d un système décisionnel pour la gestion des ventes par magasin pour la base de données EMODE. VINCENT Jérémy Roussel Xavier 13/01/12 0

Table des matières Introduction... 3 1. Scénario... 4 2. Fonctions d ETL... 5 a. Qualité des données...5 b. Packages SSIS...5 Transfert des données... 5 Gestion des tables d agrégat... 7 Ajout de données supplémentaires... 7 Automatisation de la procédure... 7 3. Optimisation... 8 a. Partitionnement...8 b. Analysis Services...8 4. Reporting... 13 a. Reporting Services... 13 b. Univers BO... 15 c. Web Intelligence... 18 d. Tableau de bord Excel... 19 Conclusion... 20 Annexes... 21 Annexe 1 : Qualité des données... 21 Annexe 2 : Ajout de nouvelles données... 29 Annexe 3 : Partitionnement des tables de fait... 32 1

Table des illustrations Figure 1 : Création de EMODE sous SQL Server... 5 Figure 2 : Transfert des données de Oracle vers SQL Server... 6 Figure 3 : Processus de transfert des données... 6 Figure 4 : Gestion des tables agrégées... 7 Figure 5 : Dimension géographie Relations entre attributs... 9 Figure 6 : Dimension géographie Hiérarchie créée... 9 Figure 7 : Dimension temps Relations entre attributs... 9 Figure 8 : Dimension temps Hiérarchie créée... 9 Figure 9 : Dimension produits Relations entre attributs... 10 Figure 10 : Dimension produits Hiérarchie créée... 10 Figure 11 : Architecture du cube... 11 Figure 12 : Exploration du cube... 12 Figure 13 : Reporting Services -Tableau... 14 Figure 14 : Reporting Services - Graphique... 14 Figure 15 : Modèle en étoile base EMODE... 15 Figure 16 : Objets métiers relatifs à l univers BO... 16 Figure 17 : Interactive Analysis Requête 1... 18 Figure 18 : Interactive Analysis Requête 2... 18 Figure 19 : Exemple de rapport Analysis Services... 18 Figure 20 : Excel - Tableau croisé dynamique... 19 Figure 21 : Excel Graphique... 19 2

INTRODUCTION Dans le cadre de l UV BD51, nous avions à notre charge la conception et le développement d un système décisionnel pour la gestion des ventes par magasin pour la base de données EMODE. Ce rapport aura comme objectif, d expliquer en détail, code source à l appui, les différentes étapes de la conception de ce projet, à savoir la mise en œuvre des fonctions d ETL, l optimisation du data warehouse et enfin, la mise en place du reporting. Ce projet a été réalisé sur une machine virtuelle de type Microsoft Virtual PC sous Windows XP 32 bits version anglaise. Les systèmes de gestion de base de données impliqués sont oracle 11g et SQL Server 2008 R2. 3

1. SCENARIO L objectif de ce projet est d obtenir, dans la finalité, un système permettant à l utilisateur lambda d avoir une vision claire sur l état des ventes par magasin de la base de données EMODE, le tout en établissant différents rapports mettant en avant les caractéristiques désirées par l utilisateur. Pour ce faire, nous sommes passés par plusieurs étapes. Dans un premier temps, nous devions effectuer un transfert de la totalité des données de la base Oracle sous une base SQL Server, le tout à l aide de fonctions d ETL, en l occurrence de packages SSIS. Dans un second temps, nous avons entrepris d optimiser les données transférées afin de diminuer au minimum les temps de calcul et d améliorer les performances de notre application. Ensuite, nous avons mis en place par le biais d un projet Analysis Services, un cube OLAP afin de naviguer au sein des données et d avoir un aperçu de la qualité de celles-ci. Ce cube nous sera également utile par la suite lors de la création de notre tableau de bord Excel. En effet, le cube précédemment créé nous servira alors de source de données. Enfin, pour terminer, nous avons mis en place différents types de rapports à l aide d outils différents, tels Reporting Services et Web Intelligence. Il est également à noter que nous avons pris la décision de ne transférer que les cinq tables suivantes : ARTICLE_COLOR_LOOKUP, ARTICLE_LOOKUP, OUTLET_LOOKUP, CALENDAR_YEAR_LOOKUP et SHOP_FACTS. En effet, après étude approfondie du sujet, il s est avéré que ces tables seront utilisées dans chaque rapport et que les autres présentes dans la base Oracle n ont qu un intérêt limité pour notre cas. De plus, ces cinq tables interviennent dans notre modèle en étoile représenté dans l univers BO. 4

2. FONCTIONS D ETL a. Qualité des données La première étape de ce projet fut la mise en place de requêtes SQL permettant de vérifier l intégrité des données dans la base d origine, à savoir Oracle 11g. En effet, avant de commencer le transfert des données il était nécessaire de vérifier que chaque contrainte est bel et bien respectée, en vérifiant par exemple l unicité de chaque contrainte de clé primaire ainsi que la présence des clés étrangères dans les tables référencées. Pour ce faire, nous avons rédigé de simples requêtes SQL (Cf. Annexe 1) que nous utiliserons par la suite au sein de nos packages SSIS afin de vérifier la conformité des données transférées. De plus, ces requêtes intègrent la traçabilité de la non conformité des données dans le sens où chaque donnée non valide sera alors transférée dans une table de rejet créée au préalable. b. Packages SSIS Le transfert des données de la base Oracle vers SQL Server s effectue à l aide de packages SSIS créés avec Business Intelligence Development Studio. Chaque package à ici son rôle à jouer et c est pour cela que nous avons décidé de les traiter un par un, en les différenciant les uns des autres. Transfert des données Nous avons donc créé ici un premier package SSIS permettant d effectuer le transfert intégral de notre base Oracle vers notre base SQL Server. Pour ce faire, nous avons pris le parti de bien séparer chaque étape du transfert. De ce fait, nous avons un premier sous package nommé "sub création de EMODE" intégrant complètement la procédure de suppression et création de la base EMODE sous SQL Server, nécessaire avant d effectuer le transfert des données en lui-même. Ci-après un schéma présentant la procédure suivie tout au long du processus de ce sous package : Suppression de la base EMODE dans SQL SERVER Creation de EMODE dans SQL Server Création des tables de données Ajout des contraintes de clés primaires Ajout des contraintes de clés étrangères Figure 1 : Création de EMODE sous SQL Server 5

Chaque étape de ce package n est en fait qu un simple script SQL permettant de gérer manuellement chaque table de l application. Ceci laisse alors à supposer que l on connaisse l architecture des tables transférées à l avance. Ensuite, la seconde étape de la création de ce package fût de traiter le transfert à proprement parler de la totalité des données. Pour ce faire, au sein de notre package principal, à la suite de notre sous package intégrant la création de la base, nous retrouvons un élément de type "data flow" permettant alors de gérer complètement notre flux de données et ainsi de vérifier l intégrité des données transférées. D où l intérêt des requêtes créées précédemment. Transfert de ARTICLE_COLOR_L OOKUP Transfert de ARTICLE_LOOKUP Transfert de CALENDAR_YEAR_L OOKUP Transfert de OUTLET_LOOKUP Transfert de SHOP_FACTS Figure 2 : Transfert des données de Oracle vers SQL Server Lors de la récupération du contenu de chaque table dans Oracle, voici le processus enclenché afin de vérifier que les données transférées concordent avec nos attentes : Récupération des données de la base Oracle Vérification de l'intégrité des données Ajout des données dans la table de rejet Ajout des données dans la table Figure 3 : Processus de transfert des données Une fois ce processus terminé, et qu aucune erreur n est à déplorer, il est nécessaire de se préoccuper du package permettant la gestion des tables d agrégation. En effet, il est nécessaire à chaque transfert de données de la sorte de régénérer le contenu de chaque table agrégée afin d en mettre à jour le contenu. 6

Gestion des tables d agrégat Afin de gérer comme il se doit ces table d agrégat, nous avons décidé de créer une nouvelle fois un sous package nommé "Package 4 : Gestion des tables d agrégation". En effet, dans les spécifications du projet, il était nécessaire que cette fonctionnalité soit lancée à la fin de l exécution de chaque package. C est donc tout naturellement que nous avons pris le parti de créer un sous package totalement indépendant, ne prenant en compte que la gestion de ces tables d agrégats. Pour ce faire, de la même manière que pour le premier sous-package créé, nous avons simplement inséré plusieurs "SQL tasks" gérant l agrégation des tables concernées. Le processus s effectue de la sorte : Suppression des deux tables d'agrégat Création des deux tables d'agrégat Insertion des données dans les tables d'agrégat Figure 4 : Gestion des tables agrégées Ajout de données supplémentaires Suite à cela, afin de procéder à la phase de tests de nos fonctions d ETL, nous avons décidé de mettre au point deux manières différentes d effectuer ces tests. Dans un premier temps, en alimentant complètement la base EMODE, en partant d une base vide sous SQL Server. Dans un deuxième temps, nous avons choisi d insérer de nouvelles données, relatives à la semaine de janvier 2012 afin d avoir une nouvelle vision des données et qui permettrait également de vérifier que nos fonctions gérant l agrégation des données s effectue correctement. (Cf. Annexe 2) Automatisation de la procédure Pour terminer concernant la partie packages SSIS, nous avons choisi d automatiser l exécution de ces procédures. En effet, nous avons créé différents SQL Server Agent Jobs afin que ces packages soient exécutés en temps voulu. 7

3. OPTIMISATION a. Partitionnement Le fait de partitionner nos deux tables de fait (ici, SHOP_FACTS et PRODUCT_PROMOTION_FACTS) améliore nettement les performances et simplifie la maintenance des ces tables. En effet, ces tables sont amenées à l avenir à augmenter considérablement en volumétrie. De ce fait, un partitionnement devient alors nécessaire dans le sens où de meilleures performances seront nécessaires en cas de traitement sur ces données. A savoir que la procédure de partitionnement pour ces deux tables est la même à chaque fois. 1. Création des storages 2. Ajout des fichiers aux storages 3. Création de la fonction de partitionnement 4. Création du schéma de partitionnement 5. Création de la table partitionnée Cf. Annexe 3 pour retrouver le code de partitionnement de chacune de ces tables. b. Analysis Services Un des points importants de ce projet fût également la création d un cube OLAP et de ses dimensions sous Analysis Services. Pour ce faire, nous avons dans un premier temps créé une nouvelle source de données afin de nous connecter directement à notre base SQL Server. Dans un deuxième temps, nous avons mis en place ce que l on appelle un "Data Source View" afin de nous connecter à notre base de données, et qui nous permettra par la suite de récupérer les différentes informations nécessaires à la création de notre cube, des dimensions et de ses mesures associées. La troisième étape consistait à créer le cube en lui même. Pour l instant, celui-ci est vide et ne contient aucune mesure ni dimensions. En effet, nous avons privilégié le fait de les créer manuellement plutôt que d utiliser l assistant. La quatrième étape concernait la création de nos dimensions associées à notre cube. Dans notre cas, nous avons privilégié trois dimensions principales, qui nous paraissaient les plus évidentes lors de notre étude, à savoir les dimensions de temps (CALENDAR_YEAR_LOOKUP), de géographie (OUTLET_LOOKUP) et enfin de produits (ARTICLE_LOOKUP). 8

Géographie Figure 5 : Dimension géographie Relations entre attributs Temps Figure 6 : Dimension géographie Hiérarchie créée Figure 7 : Dimension temps Relations entre attributs Figure 8 : Dimension temps Hiérarchie créée 9

Produit Figure 9 : Dimension produits Relations entre attributs Figure 10 : Dimension produits Hiérarchie créée La cinquième étape de ce projet fût la création de nos mesures. Celles-ci ont été récupérées au sein de la table de faits SHOP_FACTS et nous permettent ensuite de calculer les données de type "Marge", "Quantité vendue" et "Montant des ventes". 10

Enfin, la sixième et dernière étape de la création de ce projet Analysis Services fût d explorer le cube en utilisant les différentes mesures et dimensions créées. Ci-après, quelques images illustrant les résultats obtenus. Figure 11 : Architecture du cube 11

Exploration du cube dans Analysis Services Figure 12 : Exploration du cube 12

4. REPORTING Une des dernières étapes de la réalisation de ce projet consistait à créer et explorer différents rapports analysant les ventes de chaque magasin du système EMODE. Pour ce faire, nous utiliserons différentes technologies afin de varier les sources de nos rapports et d utiliser les différents outils étudiés au cours de cette UV. a. Reporting Services Nous avons donc dans ce cas créé un projet de type Reporting Services, nous ayant permis de créer des rapports de type tableaux et graphiques. Dans un premier temps, après avoir créé un nouveau projet Analysis Services, nous avons créé plusieurs nouveaux rapports correspondant à chacune des mesures que nous voulons étudier. Nous avons ensuite ajouté une source de données à chacun de nos rapports. Cette source de données n est autre qu une connexion à la base SQL Server. Par la suite, il a fallu créer des "datasets". Ces éléments correspondent ni plus ni moins à la sélection des données que nous désirons mettre en évidence au sein de nos rapports. Dans notre cas, nous avons décidé de saisir des requêtes SQL nous amenant au résultat désiré. Nous avons donc pour terminer créé et implémenté nos rapports avec le type d élément désiré tel des tableaux ou des graphiques. Une fois les rapports mis en forme et terminés, il nous est donc resté à les publier sur le serveur afin que ceux-ci soient accessibles directement depuis le navigateur web à l adresse suivante : http://xpsql:8080/reports. 13

Figure 13 : Reporting Services -Tableau Figure 14 : Reporting Services - Graphique 14

b. Univers BO Nous avons utilisé ici le logiciel Universe Designer afin de recréer le modèle en étoile suivant : Figure 15 : Modèle en étoile base EMODE 15

Ce modèle intègre les tables associées à notre de table de faits SHOP_FACTS ainsi que nos deux table agrégées créées au sein de notre package SSIS dans la première partie du projet. Ces tables vont permettre par la suite d améliorer considérablement les performances en terme d affichage des données dans le sens où tout est plus ou moins précalculé et donc le temps de chargement et de calcul sera moins long. Dans un premier temps, nous avons dû nous connecter à notre base de données. Pour ce faire, il nous a fallu créer une connexion entre Universe Designer et SQL Server et donc de créer une nouvelle "datasource name" au sein de notre système d exploitation. Par la suite, la connexion avec la base s est effectuée d elle même en utilisant "OLEDB provider for SQL Server 2008". Une fois connectés à la base, une liste des tables disponibles pour mettre en place notre modèle, nous est fournie depuis notre base de données. Après avoir sélectionné les tables désirées, il nous a suffit d organiser tous les objets métiers de la manière suivante : Figure 16 : Objets métiers relatifs à l univers BO 16

Pour terminer, une dernière étape reste nécessaire afin d obtenir les meilleurs résultats possibles : Mettre en place la navigation agrégée à l aide de la fonction agregate_aware(). Exemple de la navigation agrégée pour les propriétés Revenu des Ventes et Pays: @aggregate_aware(sum(agg_yr_qt_mt_mn_wk_rg_cy_sn_sr_qt_ma.sales_revenue),s um(agg_yr_qt_m_st_ln_ca_sr.sales_revenue),sum(shop_facts.amount_sold)) @aggregate_aware(agg_yr_qt_m_st_ln_ca_sr.state,outlet_lookup.state) 17

c. Web Intelligence Une fois notre univers (Universe Designer) créé, et donc disponible pour Interactive Analysis, nous étions en mesure de créer les rapports désirés. Pour ce faire, an guise de set de données, nous avons sélectionné les requêtes suivantes : Figure 17 : Interactive Analysis Requête 1 Figure 18 : Interactive Analysis Requête 2 Enfin, une fois nos requêtes créées, vérifiées et compilées, nous étions en mesure de créer nos rapports. Figure 19 : Exemple de rapport Analysis Services 18

d. Tableau de bord Excel Pour terminer avec ce projet, la dernière étape consistait à créer un tableau de bord sous Excel, récapitulatif des différents rapports créés. Après avoir installé Power Pivot pour Excel, nous nous sommes directement connectés à notre cube Analysis Services pour ensuite créer un tableau croisé dynamique, un graphique exploitant les même données que notre tableau ainsi que deux slicers agissant comme filtres de données et de mettre à jour nos tableaux et courbes au sein du document. Figure 20 : Excel - Tableau croisé dynamique Figure 21 : Excel Graphique 19

CONCLUSION Ce projet "Business Intelligence & Data Warehouse" nous aura permis de mettre en application les nombreuses méthodes abordées au cours de l UV BD51. Ainsi, il reprend une bonne partie des notions vues en cours et en TP. De plus, ce projet nous aura également permis d aborder un nouvel aspect de la notion d administration de base de données, jusque ici inconnue à nos yeux, à savoir la construction de cubes et ses dimensions associées ainsi que la création et gestion totale de rapports d analyse. La tâche s est en revanche avérée plus complexe lorsqu il a fallu aborder la partie des packages SSIS. En effet, ceci étant complètement nouveau cela nous a permis, en plus d appliquer nos connaissances, d effectuer des recherches supplémentaires afin de mettre en place ce système, et donc d acquérir une certaine autonomie et rigueur en termes de réalisation de projet. Notre projet présente certes quelques lacunes au niveau des fonctions d ETL, mais il nous a permis d aborder des notions nouvelles en rapport avec un projet de cette envergure, dans sons ensemble, tant dans la réflexion que dans la réalisation, avec une collaboration des membres du projet ayant chacun un bagage technique différent. C est principalement pour ces raisons que la réalisation d un tel projet nous apporte une grande satisfaction autant personnelle que professionnelle. 20

ANNEXES Annexe 1 : Qualité des données Ci-après, les scripts SQL vérifiant la qualité des données des tables utilisées tout au long du projet. Le reste des scripts se trouve sur le CD contenant les sources du projet. ARTICLE_COLOR_LOOKUP (PK : ARTICLE_CODE, COLOR_CODE) --Clés primaires en double ACL.ARTICLE_CODE AS "Article code", ACL.COLOR_CODE AS "Color code", CONCAT(ACL.ARTICLE_CODE,ACL.COLOR_CODE) AS "Article code + Color code", COUNT(CONCAT(ACL.ARTICLE_CODE,ACL.COLOR_CODE)) AS "Nombre de clés primaires" ARTICLE_COLOR_LOOKUP ACL GROUP BY ACL.ARTICLE_CODE, ACL.COLOR_CODE, CONCAT(ACL.ARTICLE_CODE,ACL.COLOR_CODE) HAVING COUNT(CONCAT(ACL.ARTICLE_CODE,ACL.COLOR_CODE)) > 1 ORDER BY 1 ASC; --Clés étrangères manquantes --/ --Table de rejet des données invalides CREATE TABLE ARTICLE_COLOR_LOOKUP_BIN AS ( * ARTICLE_COLOR_LOOKUP WHERE 1=2); INSERT INTO ARTICLE_COLOR_LOOKUP_BIN( ARTICLE_CODE, COLOR_CODE, ARTICLE_LABEL, COLOR_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) ACL.ARTICLE_CODE, ACL.COLOR_CODE, ACL.ARTICLE_LABEL, ACL.COLOR_LABEL, ACL.CATEGORY, ACL.SALE_PRICE, ACL.FAMILY_NAME, ACL.FAMILY_CODE ARTICLE_COLOR_LOOKUP ACL WHERE COMMIT; CONCAT(ACL.ARTICLE_CODE,ACL.COLOR_CODE) IN( CONCAT(ACL2.ARTICLE_CODE,ACL2.COLOR_CODE) ARTICLE_COLOR_LOOKUP ACL2 GROUP BY CONCAT(ACL2.ARTICLE_CODE,ACL2.COLOR_CODE) HAVING COUNT(CONCAT(ACL2.ARTICLE_CODE,ACL2.COLOR_CODE))>1); 21

ARTICLE_LOOKUP (PK : ARTICLE_CODE) --Clés primaires en double AL.ARTICLE_CODE AS "ARTICLE_CODE", COUNT(AL.ARTICLE_CODE) AS "Nombre de clés primaires" ARTICLE_LOOKUP AL GROUP BY AL.ARTICLE_CODE HAVING COUNT(AL.ARTICLE_CODE) > 1 ORDER BY 1 ASC; --Clés étrangères manquantes --/ --Table de rejet des données invalides CREATE TABLE ARTICLE_LOOKUP_BIN AS ( * ARTICLE_LOOKUP WHERE 1=2); INSERT INTO ARTICLE_LOOKUP_BIN( ARTICLE_CODE, ARTICLE_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) AL.ARTICLE_CODE, AL.ARTICLE_LABEL, AL.CATEGORY, AL.SALE_PRICE, AL.FAMILY_NAME, AL.FAMILY_CODE ARTICLE_LOOKUP AL WHERE AL.ARTICLE_CODE IN( AL2.ARTICLE_CODE ARTICLE_LOOKUP AL2 GROUP BY AL2.ARTICLE_CODE HAVING COUNT(AL2.ARTICLE_CODE)>1); COMMIT; 22

CALENDAR_YEAR_LOOKUP (PK : WEEK_KEY) --Clés primaires en double CYL.WEEK_KEY AS "Week key", COUNT(CYL.WEEK_KEY) AS "Nombre de clés primaires" CALENDAR_YEAR_LOOKUP CYL GROUP BY CYL.WEEK_KEY HAVING COUNT(CYL.WEEK_KEY) > 1 ORDER BY 1 ASC; --Clés étrangères manquantes --/ --Table de rejet des données invalides CREATE TABLE EMODE.CALENDAR_YEAR_LOOKUP_BIN AS ( * EMODE.CALENDAR_YEAR_LOOKUP WHERE 1=2); INSERT INTO EMODE.CALENDAR_YEAR_LOOKUP_BIN( WEEK_KEY, WEEK_IN_YEAR, "YEAR", FISCAL_PERIOD, YEAR_WEEK, QUARTER, MONTH_NAME, "MONTH", HOLIDAY_FLAG) CYL.WEEK_KEY, CYL.WEEK_IN_YEAR, CYL."YEAR", CYL.FISCAL_PERIOD, CYL.YEAR_WEEK, CYL.QUARTER, CYL.MONTH_NAME, CYL."MONTH", CYL.HOLIDAY_FLAG CALENDAR_YEAR_LOOKUP CYL WHERE CYL.WEEK_KEY IN( CYL2.WEEK_KEY CALENDAR_YEAR_LOOKUP CYL2 GROUP BY CYL2.WEEK_KEY HAVING COUNT(CYL2.WEEK_KEY )>1); COMMIT; 23

OUTLET_LOOKUP (PK : SHOP_CODE) --Clés primaires en double OL.SHOP_CODE AS "Shop code", COUNT(OL.SHOP_CODE) AS "Nombre de clés primaires" OUTLET_LOOKUP OL GROUP BY OL.SHOP_CODE HAVING COUNT(OL.SHOP_CODE) > 1 ORDER BY 1 ASC; --Clés étrangères manquantes --/ --Table de rejet des données invalides CREATE TABLE EMODE.OUTLET_LOOKUP_BIN AS ( * EMODE.OUTLET_LOOKUP WHERE 1=2); INSERT INTO EMODE.OUTLET_LOOKUP_BIN( SHOP_NAME, ADDRESS_1, MANAGER, DATE_OPEN, "OPEN", OWNED_OUTRIGHT, FLOOR_SPACE, ZIP_CODE, CITY, "STATE", SHOP_CODE) OL.SHOP_NAME, OL.ADDRESS_1, OL.MANAGER, OL.DATE_OPEN, OL."OPEN", OL.OWNED_OUTRIGHT, OL.FLOOR_SPACE, OL.ZIP_CODE, OL.CITY, OL."STATE", OL.SHOP_CODE OUTLET_LOOKUP OL WHERE OL.SHOP_CODE IN( OL2.SHOP_CODE OUTLET_LOOKUP OL2 GROUP BY OL2.SHOP_CODE HAVING COUNT(OL2.SHOP_CODE)>1); COMMIT; 24

SHOP_FACTS (PK : ID) --Clés primaires en double SH.ID AS "ID", COUNT(SH.ID) AS "Nombre de clés primaires" SHOP_FACTS SH GROUP BY SH.ID HAVING COUNT(SH.ID)>1; --Clés étrangères manquantes --Etape 1 SF.WEEK_KEY AS "Week_key",COUNT(*) AS "Nombre clés absentes" SHOP_FACTS SF WHERE SF.WEEK_KEY NOT IN ( DISTINCT CYL.WEEK_KEY CALENDAR_YEAR_LOOKUP CYL ) GROUP BY SF.WEEK_KEY ORDER BY 1 ASC; --Etape 2 SF.SHOP_CODE AS "Shop Code",COUNT(*) AS "Nombre clés étrangères absentes" SHOP_FACTS SF WHERE SF.SHOP_CODE NOT IN ( DISTINCT OL.SHOP_CODE OUTLET_LOOKUP OL ) OR SF.SHOP_CODE NOT IN ( DISTINCT UOLF.SHOP_CODE UNUSED_OUTLET_LOOKUP_FULL UOLF ) GROUP BY SF.SHOP_CODE ORDER BY 1 ASC; --Etape 3 SF.COLOR_CODE AS "Color_code",SF.ARTICLE_CODE AS "Article_code",COUNT(*) AS "Nombre clés étrangères absentes" SHOP_FACTS SF WHERE CONCAT(SF.COLOR_CODE,SF.ARTICLE_CODE) NOT IN ( DISTINCT CONCAT(ACL.COLOR_CODE,ACL.ARTICLE_CODE) ARTICLE_COLOR_LOOKUP ACL ) 25

AND SF.ARTICLE_CODE NOT IN ( DISTINCT AL.ARTICLE_CODE ARTICLE_LOOKUP AL ) GROUP BY SF.COLOR_CODE,SF.ARTICLE_CODE ORDER BY 1 ASC; --Table de rejet des données invalides CREATE TABLE EMODE.SHOP_FACTS_BIN AS ( * EMODE.SHOP_FACTS WHERE 1=2); INSERT INTO EMODE.SHOP_FACTS_BIN( ID, ARTICLE_CODE, COLOR_CODE, WEEK_KEY, SHOP_CODE, MARGIN, AMOUNT_SOLD, QUANTITY_SOLD) SF.ID, SF.ARTICLE_CODE, SF.COLOR_CODE, SF.WEEK_KEY, SF.SHOP_CODE, SF.MARGIN, SF.AMOUNT_SOLD, SF.QUANTITY_SOLD SHOP_FACTS SF WHERE SF.ID IN( SF2.ID SHOP_FACTS SF2 GROUP BY SF2.ID HAVING COUNT(SF2.ID)>1) ORDER BY 1 ASC ; INSERT INTO EMODE.SHOP_FACTS_BIN( ID, ARTICLE_CODE, COLOR_CODE, WEEK_KEY, SHOP_CODE, MARGIN, AMOUNT_SOLD, QUANTITY_SOLD) SF.ID, SF.ARTICLE_CODE, SF.COLOR_CODE, SF.WEEK_KEY, SF.SHOP_CODE, SF.MARGIN, SF.AMOUNT_SOLD, SF.QUANTITY_SOLD SHOP_FACTS SF WHERE SF.WEEK_KEY NOT IN ( 26

DISTINCT CYL.WEEK_KEY CALENDAR_YEAR_LOOKUP CYL ) ORDER BY 1 ASC; INSERT INTO EMODE.SHOP_FACTS_BIN( ID, ARTICLE_CODE, COLOR_CODE, WEEK_KEY, SHOP_CODE, MARGIN, AMOUNT_SOLD, QUANTITY_SOLD) SF.ID, SF.ARTICLE_CODE, SF.COLOR_CODE, SF.WEEK_KEY, SF.SHOP_CODE, SF.MARGIN, SF.AMOUNT_SOLD, SF.QUANTITY_SOLD SHOP_FACTS SF WHERE SF.SHOP_CODE NOT IN ( DISTINCT OL.SHOP_CODE OUTLET_LOOKUP OL ) AND SF.SHOP_CODE NOT IN ( DISTINCT UOLF.SHOP_CODE UNUSED_OUTLET_LOOKUP_FULL UOLF ) ORDER BY 1 ASC; INSERT INTO EMODE.SHOP_FACTS_BIN( ID, ARTICLE_CODE, COLOR_CODE, WEEK_KEY, SHOP_CODE, MARGIN, AMOUNT_SOLD, QUANTITY_SOLD) SF.ID, SF.ARTICLE_CODE, SF.COLOR_CODE, SF.WEEK_KEY, SF.SHOP_CODE, SF.MARGIN, SF.AMOUNT_SOLD, SF.QUANTITY_SOLD SHOP_FACTS SF WHERE CONCAT(SF.COLOR_CODE,SF.ARTICLE_CODE) NOT IN ( DISTINCT CONCAT(ACL.COLOR_CODE,ACL.ARTICLE_CODE) ARTICLE_COLOR_LOOKUP ACL ) OR SF.ARTICLE_CODE NOT IN ( 27

DISTINCT AL.ARTICLE_CODE ARTICLE_LOOKUP AL ) ORDER BY 1 ASC; COMMIT; 28

Annexe 2 : Ajout de nouvelles données Ajout dans ARTICLE_COLOR_LOOKUP USE EMODE GO INSERT INTO ARTICLE_COLOR_LOOKUP(ARTICLE_CODE, COLOR_CODE, ARTICLE_LABEL, COLOR_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) VALUES(200000, 997, 'Jupe en toile', 'Rouge', 'dresses', 30, 'Clothes', 'X20'); INSERT INTO ARTICLE_COLOR_LOOKUP(ARTICLE_CODE, COLOR_CODE, ARTICLE_LABEL, COLOR_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) VALUES(200001, 997, 'Jupe en laine', 'Rouge', 'dresses', 25, 'Clothes', 'X20'); INSERT INTO ARTICLE_COLOR_LOOKUP(ARTICLE_CODE, COLOR_CODE, ARTICLE_LABEL, COLOR_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) VALUES(200002, 998, 'Pantalon en soie', 'Vert', 'pants', 90, 'Clothes', 'X30'); --Insertion en double -> Table de rejet INSERT INTO ARTICLE_COLOR_LOOKUP(ARTICLE_CODE, COLOR_CODE, ARTICLE_LABEL, COLOR_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) VALUES(200002, 998, 'Pantalon en soie', 'Vert', 'pants', 90, 'Clothes', 'X30'); --Clé étrangère inexistante -> Table de rejet INSERT INTO ARTICLE_COLOR_LOOKUP(ARTICLE_CODE, COLOR_CODE, ARTICLE_LABEL, COLOR_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) VALUES(200013, 999, 'lunettes', 'bleu', 'vue', 1000, 'vue', 'G20'); COMMIT; Ajout dans ARTICLE_LOOKUP USE EMODE GO DELETE ARTICLE_COLOR_LOOKUP WHERE ARTICLE_CODE IN (200000, 200001, 200002); INSERT INTO ARTICLE_LOOKUP(ARTICLE_CODE, ARTICLE_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) VALUES(200000, 'Jupe en toile', 'dresses', 30, 'Clothes', 'X20'); INSERT INTO ARTICLE_LOOKUP(ARTICLE_CODE, ARTICLE_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) VALUES(200001, 'Jupe en laine', 'dresses', 25, 'Clothes', 'X20'); INSERT INTO ARTICLE_LOOKUP(ARTICLE_CODE, ARTICLE_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) VALUES(200002, 'Pantalon en soie', 'pants', 90, 'Clothes', 'X30'); --Meme article -> table de rejet! INSERT INTO ARTICLE_LOOKUP(ARTICLE_CODE, ARTICLE_LABEL, CATEGORY, SALE_PRICE, FAMILY_NAME, FAMILY_CODE) VALUES(200002, 'Pantalon en soie', 'pants', 90, 'Clothes', 'X30'); COMMIT; 29

Ajout dans CALENDAR_YEAR_LOOKUP USE EMODE GO INSERT INTO CALENDAR_YEAR_LOOKUP(WEEK_KEY, WEEK_IN_YEAR, "YEAR", FISCAL_PERIOD, YEAR_WEEK, QUARTER, MONTH_NAME, "MONTH", HOLIDAY_FLAG) VALUES(300, 5, 2012, 'FY12', '2012/05', 1, 'February', 2, 'y'); INSERT INTO CALENDAR_YEAR_LOOKUP(WEEK_KEY, WEEK_IN_YEAR, "YEAR", FISCAL_PERIOD, YEAR_WEEK, QUARTER, MONTH_NAME, "MONTH", HOLIDAY_FLAG) VALUES(301, 5, 2012, 'FY12', '2012/05', 1, 'February', 2, 'y'); INSERT INTO CALENDAR_YEAR_LOOKUP(WEEK_KEY, WEEK_IN_YEAR, "YEAR", FISCAL_PERIOD, YEAR_WEEK, QUARTER, MONTH_NAME, "MONTH", HOLIDAY_FLAG) VALUES(302, 5, 2012, 'FY12', '2012/05', 1, 'February', 2, 'y'); --Meme date -> table de rejet! INSERT INTO CALENDAR_YEAR_LOOKUP(WEEK_KEY, WEEK_IN_YEAR, "YEAR", FISCAL_PERIOD, YEAR_WEEK, QUARTER, MONTH_NAME, "MONTH", HOLIDAY_FLAG) VALUES(302, 5, 2012, 'FY12', '2012/05', 1, 'February', 2, 'y'); COMMIT; Ajout dans OUTLET_LOOKUP USE EMODE GO INSERT INTO OUTLET_LOOKUP(SHOP_NAME, ADDRESS_1, MANAGER, DATE_OPEN, "OPEN", OWNED_OUTRIGHT, FLOOR_SPACE, ZIP_CODE, CITY, "STATE", SHOP_CODE) VALUES ('e-fashion Belfort', 'Route de lure', 'Jeremy', '15-DEC-00', 'Y', 'N', 4160, '90000', 'Belfort', 'France', 400); INSERT INTO OUTLET_LOOKUP(SHOP_NAME, ADDRESS_1, MANAGER, DATE_OPEN, "OPEN", OWNED_OUTRIGHT, FLOOR_SPACE, ZIP_CODE, CITY, "STATE", SHOP_CODE) VALUES ('e-fashion Lure', 'Route de Belfort', 'Jeremy', '15-DEC-00', 'Y', 'N', 4160, '70100', 'Lure', 'France', 401); INSERT INTO OUTLET_LOOKUP(SHOP_NAME, ADDRESS_1, MANAGER, DATE_OPEN, "OPEN", OWNED_OUTRIGHT, FLOOR_SPACE, ZIP_CODE, CITY, "STATE", SHOP_CODE) VALUES ('e-fashion Besancon', 'Route de Luxeuil', 'Jeremy', '15-DEC-00', 'Y', 'N', 4160, '25000', 'Besancon', 'France', 402); --Meme boutique -> table de rejet! INSERT INTO OUTLET_LOOKUP(SHOP_NAME, ADDRESS_1, MANAGER, DATE_OPEN, "OPEN", OWNED_OUTRIGHT, FLOOR_SPACE, ZIP_CODE, CITY, "STATE", SHOP_CODE) VALUES ('e-fashion Besancon', 'Route de Luxeuil', 'Jeremy', '15-DEC-00', 'Y', 'N', 4160, '25000', 'Besancon', 'France', 402); COMMIT; 30

Ajout dans SHOP_FACTS USE EMODE GO INSERT INTO SHOP_FACTS(ID,ARTICLE_CODE,COLOR_CODE,WEEK_KEY,SHOP_CODE,MARGIN,AMOUNT_SOLD,QU ANTITY_SOLD) VALUES(90000,200000,997,300,400,20,90,3); --Erreur clé primaire -> Table de rejet INSERT INTO SHOP_FACTS(ID,ARTICLE_CODE,COLOR_CODE,WEEK_KEY,SHOP_CODE,MARGIN,AMOUNT_SOLD,QU ANTITY_SOLD) VALUES(90000,200000,997,300,400,20,90,3); --Erreur clé étrangère : ARTICLE_CODE -> Table de rejet INSERT INTO SHOP_FACTS(ID,ARTICLE_CODE,COLOR_CODE,WEEK_KEY,SHOP_CODE,MARGIN,AMOUNT_SOLD,QU ANTITY_SOLD) VALUES(90001,200500,997,300,400,20,90,3); --Erreur clé étrangère (COLOR_CODE) -> Table de rejet INSERT INTO SHOP_FACTS(ID,ARTICLE_CODE,COLOR_CODE,WEEK_KEY,SHOP_CODE,MARGIN,AMOUNT_SOLD,QU ANTITY_SOLD) VALUES(90002,200000,994,300,400,20,90,3); --Erreur clé étrangère : WEEK_KEY -> Table de rejet INSERT INTO SHOP_FACTS(ID,ARTICLE_CODE,COLOR_CODE,WEEK_KEY,SHOP_CODE,MARGIN,AMOUNT_SOLD,QU ANTITY_SOLD) VALUES(90003,200000,994,700,400,20,90,3); --Erreur clé étrangère : SHOP_CODE -> Table de rejet INSERT INTO SHOP_FACTS(ID,ARTICLE_CODE,COLOR_CODE,WEEK_KEY,SHOP_CODE,MARGIN,AMOUNT_SOLD,QU ANTITY_SOLD) VALUES(90004,200000,994,300,700,20,90,3); COMMIT; 31