lundi 14 avril 2014

Conseil 68: Forer latéralement dans les données avec SQL

Le forage latéral fait réfèrence au processus qui interroge plusieurs tables de faits et en combine les résultats dans un ensemble de données unique. Un exemple courant consiste à combiner les données prévisionnelles avec des données réelles. Les données prévisionnelles sont généralement conservées dans une table séparée, capturé à un niveau de détail différent de celui des données réelles. Quand un utilisateur veut un rapport qui compare le réel et le prévisionnel par client, la requête doit mixer deux tables de faits. (Note: les données des deux tables de faits peuvent être combinées uniquement si elles sont construites en utilisant des dimensions conformes. Le client, la date et toutes autres dimensions partagées doivent être exactement les mêmes dans les deux schémas en étoile).

Le moyen le plus efficace de combiner les données des deux tables de fait est d'exécuter des requêtes distinctes sur chaque table, puis de combiner les deux ensembles de résultats en faisant correspondre leurs attributs communs. Cette solution focntionne bien car la plupart des optimiseurs de base de données reconnaissent chaque requête unique et retournent rapidement les deux ensembles de résultats.


L'instruction SQL suivante est utilisée pour forer à travers deux schémas en étoile, ventes réelles et ventes prévisionnelles, associées aux dimensions Client et Date. La requête utilise des instructions SELECT dans la clause FROM pour créer deux sous-requêtes et joindre leurs résultats ensemble, exactement comme nous le souhaitions. Même si vous n'avez pas à écrire le SQL vous-même, vous aurez une idée de ce que votre outil décisionnel peut être fait.


SELECT Act.Client, Act.Année, Act.Mois, Montant_Réel, Montant_Prév

FROM

– sous requête “Act” retournant les résultats du réel

   (SELECT Nom_Client AS Client, Année, Nom_Mois AS Mois, SUM(Montant_Ventes) Montant_Réel
   FROM Faits_Ventes A
   INNER JOIN Client C
      ON A.Clé_Client = C.Clé_Client


   INNER JOIN Date D

      ON A.Clé_Date_Ventes = D.Clé_Date

   GROUP BY Nom_Client, Année, Nom_Mois) Act

INNER JOIN

– sous requête“Fcst” retournant les résultat du prévisionnel

   (SELECT Nom_Client AS Client, Année, Nom_Mois AS Mois, SUM(Montant_Prév) Montant_Prév
   FROM Faits_Prev F
   INNER JOIN Client C
      ON F.Clé_Client = C.Clé_Client


   INNER JOIN Date D

      ON F.Clé_Date_Ventes = D.Clé_Date

   GROUP BY Nom_Client, Année, Nom_Mois) Fcst

– Conditions de jointure condition pour nos deux sous ensembles de données

ON Act.Client = Fcst.Client 

   AND Act.Année= Fcst.Année
   AND Act.Mois= Fcst.Mois


Cela devrait s'exécuter presque aussi rapidement que de faire les deux requêtes individuellement sur les tables de faits parce que la jointure se fait sur un sous-ensemble de données relativement petit qui est déjà en mémoire. Les résultats devraient ressembler à ceci:

Sous requête "Act":

Client                    Année            Mois                  Montant_Réel

Big Box                 2005              Mai                       472,394

Small Can             2005              Mai                    1,312,034

Sous requête "Fcst":

Client                    Année            Mois                  Montant_Prev

Big Box                 2005             Mai                        435,000

Small Can             2005             Mai                     1,257,000

Résultat final:

Client                    Année          Mois                    Montant_Réel               Montant_Prev

Big Box                 2005            Mai                         472,394                           435,000

Small Can             2005            Mai                      1,312,034                       1,257,000

Rappelez-vous que si vous n'utilisez pas rigoureusement des dimensions conformes, vous ne pourrez pas comparer des pommes avec des pommes quand vous forerez!


Source originale: www.kimballgroup.com
Article original "Kimball Design Tip #68: Simple Drill accross in SQL", publié le 3 juin 2005.

Aucun commentaire:

Enregistrer un commentaire