MDX : rollup calculation on leaf level

C’est une question m’est assez souvent posé : comment créer un mesure calculée sur le niveau feuille d’un attribut et faire que celle-ci s’agrège correctement ?

En prenant le modèle AdventureWorksDW2012, imaginons que nous ne voulions analyser que les modèles de produits dont les ventes sont supérieures à un certain seuil. 

Je déclare dans un premier temps la mesure de la façon la plus simple qu’il soit :

CREATE MEMBER CURRENTCUBE.[MEASURES].[Test] AS
IIF(
  [Measures].[Internet Sales Amount] > 3000,
  [Measures].[Internet Sales Amount],
  NULL
),
FORMAT_STRING = "#,#.00",
VISIBLE = 1;

MDX Rollup Leaf Calculation - 1

On constate alors que la mesure fonctionne correctement sur le niveau feuille de l’attribut, mais que le total général n’est pas celui désiré.

Pour corriger ce problème, il suffit tout simplement de mettre en place un scope nous permettant :

  • d’afficher la mesure si l’on est sur le niveau feuille de l’attribut
  • et dans le cas contraire, de sommer les valeurs relatives à  l’ensemble des membres répondant au context filter

SCOPE [MEASURES].[Test];
THIS =
  CASE ISLEAF([Product].[Model Name].CurrentMember)
    WHEN TRUE THEN
      [MEASURES].[Test]
    ELSE
      SUM(
        EXISTING(
          DESCENDANTS([Product].[Model Name].CurrentMember,, LEAVES)
        ),
        [MEASURES].[Test]
      )
  END;
END SCOPE;

N’oubliez surtout pas l’utilisation de l’opérateur EXISTING permettant ici d’appliquer le context filter sur les descendants et donc de s’assurer que la mesure affichera le bon résultat quel que soit l’analyse effectuée. MDX Rollup Leaf Calculation - 2 Quelques références clés autour du mot clé EXISTING :

  • la référence MSDN
  • et un chef d’œuvre en la matière disponible sur le blog de François

2 réflexions sur “MDX : rollup calculation on leaf level

  1. Merci Frédéric! Après dans le cas général pour t’éviter le Sum(Existing(…)) et si ton agrégation est une native de SSAS, tu peux définir une mesure « physique » de type somme, la scoper à Null dans le cas général et appliquer un SCOPE (Leaves(…)) dessus, dans lequel tu définis la valeur de tes feuilles non nulles. Le sum étant ensuite appliqué par le moteur. Cool d’avoir posté là dessus, j’aime bien voir du MDX le matin🙂

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s