14
SQL Server 2008-2016 Dominique Verrière Dialogue Formation Informatique SQL Server 2008-2016 Découverte du langage MDX partie 4

Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

SQL Server 2008-2016

Dominique Verrière

Dialogue Formation Informatique

SQL Server 2008-2016

Découverte du langage MDX partie 4

Page 2: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

SQL Server : Le blog de Dominique Verrière 2

Page 3: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Introduction

Ce petit fascicule fait partie d’une liste de notes que je publie gratuitement sur mon site.

J’essaie de mettre dans ces notes mon expérience de terrain en toute indépendance de Microsoft.

Dominique Verrière

Page 4: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Table des matières Utiliser la dimension temps.......................................................................................... 6

Introduction ........................................................................................................................................................... 6

Parrallelperiod ....................................................................................................................................................... 7

Exemple du mois équivalent de l’année précédente ........................................................................................ 8

PeriodsToDate ..................................................................................................................................................... 11

Aller plus loin ............................................................................................................. 13

Contacter l’auteur ...................................................................................................... 14

Page 5: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Sommaire

SQL Server : Le blog de Dominique Verrière 5

Page 6: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Utiliser la dimension temps

SQL Server Le blog de Dominique Verrière

Utiliser la dimension temps

Introduction Nous allons, dans ce petit article, utiliser deux des principales fonctions applicables à la dimension temps.

Qu’est-ce qu’une dimension temps ?

Une dimension bien particulière, de type time, sur laquelle des fonctions spécifiques aux temps sont

disponibles.

Par ailleurs certains agrégats ne sont disponibles qu’avec ce type de dimension.

Bien monter une dimension temps est fondamental pour la réussite (ou l’échec) du projet cube.

La dimension est bien de type time ?

Oui, c’est le cas ici ; à défaut rien ne fonctionnera !

Une dimension de type time contient des hiérarchies utilisateur, nous allons naviguer dans ces hiérarchies :

Page 7: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Utiliser la dimension temps

SQL Server : Le blog de Dominique Verrière 7

Parrallelperiod Voici sans doute l’une des fonctions les plus utilisées en MDX.

Son but :

Donner une période de temps équivalent dans le passé (en général, même s’il est possible d’aller dans le

futur).

Grâce à elle, tous les ratios seront possibles :

Sa syntaxe :

PARALLELPERIOD( [«Level»[, «Numeric Expression»[, «Member»] ] ] )

Cette fonction rend un membre en se déplaçant en trois étapes :

J’appelle d’ailleurs cela « l’algorithme des échelles »

Le troisième paramètre est quant à lui, plus rarement utilisé car il permettra de partir d’un autre endroit que

l’emplacement par défaut (currentmember).

Evolution par rapport au même mois de l’année dernière

Progression par rapport à samedi dernier à la même heure

Etc.

1. On remonte au niveau (level) du premier paramètre

2. On se déplace à gauche de la valeur du deuxième paramètre

3. On redescend du même nombre ‘d’étages’ que celui remonté à l’’étape 1

Page 8: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Utiliser la dimension temps

SQL Server Le blog de Dominique Verrière

Exemple du mois équivalent de l’année précédente

Tout d’abord une petite introspection pour montre un problème « sympathique »:

with member [Measures].[MoisAnneePrec] as PARALLELPERIOD( [Date Commande].[Calendrier Legal].[Annee],1).name select [Measures].[MoisAnneePrec] on columns, [Date Commande].[Calendrier Legal].[Mois] on rows from [Analyse Ventes2012];

Oups !

Que se passe-t-il ?

Juillet équivalent à janvier ????

C’est dû au fameux algorithme des échelles, la vraie cause étant que cette dimension temps n’est pas

correctement montée !

Tout se régularise ensuite :

Page 9: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Utiliser la dimension temps

SQL Server : Le blog de Dominique Verrière 9

Amusant non ?

Passons maintenant à nos ratios, en prenant bien garde de ne pas étudier les premières années :

with member [Measures].[CaAnneePrec] as ( [Measures].[Montant Ventes], PARALLELPERIOD( [Date Commande].[Calendrier Legal].[Annee],1) ) member [Measures].[Evolution] as ([Measures].[Montant Ventes] - [Measures].[CaAnneePrec]) / [Measures].[CaAnneePrec] select { [Measures].[Montant Ventes], [Measures].[CaAnneePrec], [Measures].[Evolution] } on columns, non empty [Date Commande].[Calendrier Legal].[Mois] on rows from [Analyse Ventes2012];

Page 10: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Utiliser la dimension temps

SQL Server Le blog de Dominique Verrière

Tout cela n’est pas très formaté…

with member [Measures].[CaAnneePrec] as ( [Measures].[Montant Ventes], PARALLELPERIOD( [Date Commande].[Calendrier Legal].[Annee],1) ) ,format_string="currency" member [Measures].[Evolution] as [Measures].[Montant Ventes] / [Measures].[CaAnneePrec] ,format_string="percent" select { [Measures].[Montant Ventes], [Measures].[CaAnneePrec], [Measures].[Evolution] } on columns, non empty [Date Commande].[Calendrier Legal].[Mois] on rows from [Analyse Ventes2012];

(Après révision de la formule de calcul et des format_string)

Un développeur MDX sérieux prendra garde aux divisions par zéro.

Page 11: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Utiliser la dimension temps

SQL Server : Le blog de Dominique Verrière 11

PeriodsToDate

Cette fonction a pour syntaxe :

PERIODSTODATE( [«Level»[, «Member»] ] )

Son but, contrairement à ce que son nom liasse présager, permet d’obtenir toutes les périodes de temps

jusqu’à un membre donné, qui, s’il n’est pas précisé est le currentmember de la hiérarchie que l’on parcourt.

Elle servira, entre autres, à obtenir des cumuls glissants.

Petit exemple :

Les trimestres jusqu’au troisième trimestre 2017 :

select [Measures].[Montant Ventes] on columns, PERIODSTODATE([Date Commande].[Calendrier Legal].[Annee], [Date Commande].[Calendrier Legal].[Trimestre].&[2017]&[3]) on rows from [Analyse Ventes2012];

Est-il possible d’obtenir un « vrai to date »

Nous avons déjà évoqué les fonctions VBA pour MDX, nous allons y avoir de nouveau recours.

Notre premier besoin : obtenir une mesure calculée qui donne le trimestre actuel (selon la date système).

Quelque chose comme :

with member [Date Commande].[Calendrier Legal].TrimestreActuel as STRTOMEMBER("[Date Commande].[Calendrier Legal].[Trimestre].&[2017]&[3]").name select [Date Commande].[Calendrier Legal].TrimestreActuel on columns from [Analyse Ventes2012];

Mais, en dynamique, au moyen des fonctions VBA :

with member [Measures].TrimestreActuel as ".&[" + vbamdx!cstr(vbamdx!year(vbamdx!now())) + "]&["

Page 12: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Utiliser la dimension temps

SQL Server Le blog de Dominique Verrière

+ vbamdx!cstr(vbamdx!datepart("Q",vbamdx!now())) + "]" select [Measures].TrimestreActuel on columns from [Analyse Ventes2012];

Je me suis limité à la fin du uniquename, pour pouvoir l’utiliser dans une hiérarchie de mon choix.

On note que le keycolumns de mon niveau Trimestre est constitué de l’année suivi du numéro de trimestre.

Voici le résultat complet :

with member [Measures].TrimestreActuel as ".&[" + vbamdx!cstr(vbamdx!year(vbamdx!now())) + "]&[" + vbamdx!cstr(vbamdx!datepart("Q",vbamdx!now())) + "]" select [Measures].[Montant Ventes] on columns, PERIODSTODATE ( [Date Commande].[Calendrier Legal].[Annee], strtomember("[Date Commande].[Calendrier Legal].[Trimestre]" +[Measures].TrimestreActuel) ) on rows from [Analyse Ventes2012];

Sachant que je poste cet article en juin 2017, nous sommes bien avec deux trimestres !

Naturellement les mesures calculées ont vocation à être embarquées dans le cube, mais c’est un autre

sujet !

Page 13: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Utiliser la dimension temps

SQL Server : Le blog de Dominique Verrière 13

Aller plus loin

Vous pouvez, au choix :

Pratique du langage MDX

Me voir ‘en live’ chez Orsys

Attendre le prochain article

Acheter mon livre sur le sujet :

Page 14: Découverte du langage MDX partie 4dominiqueverriere.fr/Articles/DV_Decouverte_langage_MDX... · 2017-06-20 · Un développeur MDX sérieux prendra garde aux divisions par zéro

Contact

SQL Server Le blog de Dominique Verrière

Contacter l’auteur

Dominique Verrière est un consultant spécialisé sur les technologies SQL Server : moteur relationnel, SSIS, SSRS et SSAS. Il intervient dans les entreprises pour des missions d'audit, de suivi de performances, d'administration de bases de données. Les bases de données dont il s'occupe peuvent contenir plusieurs milliards de lignes et atteindre des Téra octets; son expérience du terrain est donc significative. Afin de compléter cet article, un blog www.dominiqueverriere.fr est régulièrement mis à jour avec des articles sur les nouveautés ou expériences nouvelles de l'auteur