2008-10-13 19 views
2

Je dois définir un membre calculé dans MDX (c'est SAS OLAP, mais j'apprécierais les réponses de personnes qui travaillent avec différentes implémentations OLAP de toute façon).Définition d'un membre calculé dans MDX - filtrage de la valeur d'une mesure

La valeur de la nouvelle mesure doit être calculée à partir d'une mesure existante en appliquant une condition de filtre supplémentaire. Je suppose que ce sera plus clair avec un exemple:

  • Mesure existante: "Le trafic total"
  • dimension existante: "Direction" ("In" ou "Out")
  • Je dois créer un calcul membre "Trafic entrant", qui équivaut à "Trafic total" avec un filtre supplémentaire (Direction = "In")

Le problème est que je ne connais pas MDX et que mon planning est très serré (donc désolé pour une question de débutant). Le mieux que je pouvais trouver est:

([Measures].[Total traffic], [Direction].[(All)].[In]) 

Ce qui fonctionne presque, à l'exception des cellules avec direction spécifique:

example

il ressemble le filtre « intrinsèque » sur la direction est surchargée par mon propre filtre). J'ai besoin d'une intersection du filtre "intrinsèque" et du mien. Mon intuition était que cela a à voir avec Intersection [Direction].[(All)].[In] avec les coeurs intrinsèques de la cellule en cours d'évaluation, mais il est difficile de savoir ce dont j'ai besoin sans avoir lu d'abord sur le sujet :)

[edit] Je me suis retrouvé avec

IIF([Direction].currentMember = [Direction].[(All)].[Out], 
    0, 
    ([Measures].[Total traffic], [Direction].[(All)].[In]) 
) 

..mais au moins dans SAS OLAP cela provoque des requêtes supplémentaires à effectuer (pour calculer la valeur pour [en]) à l'ensemble de données sous-jacentes, donc je ne l'utilisait pas à la fin.

Répondre

7

Pour commencer, vous pouvez définir une nouvelle mesure calculée dans votre MDX, et lui dire d'utiliser la valeur d'une autre mesure, mais avec un filtre appliqué:

WITH MEMBER [Measures].[Incoming Traffic] AS 
'([Measures].[Total traffic], [Direction].[(All)].[In])' 

Chaque fois que vous vous présentez la nouvelle mesure un rapport, il se comportera comme s'il avait un filtre de 'Direction> In' dessus, que la dimension Direction soit ou non utilisée.

Mais dans votre cas, vous VOULEZ que la dimension Direction prenne de l'importance quand elle est utilisée .... donc les choses deviennent un peu compliquées. Vous devrez détecter si cette dimension est en cours d'utilisation, et agir en conséquence:

WITH MEMBER [Measures].[Incoming Traffic] AS 
'IIF([Direction].currentMember = [Direction].[(All)].[Out], 
    ([Measures].[Total traffic]), 
    ([Measures].[Total traffic], [Directon].[(All)].[In]) 
)' 

Pour voir si la dimension est utilisé, nous vérifions si la cellule actuelle utilise OUT. Si oui, nous pouvons retourner le trafic total tel qu'il est. Sinon, nous pouvons lui dire d'utiliser IN dans notre tuple.

+0

À l'exception du trafic entrant [out] = 0, alors au lieu de "([Mesures]. [Trafic total])" J'ai utilisé "0". Merci beaucoup! – Nickolay

1

Je pense que vous devriez mettre une colonne dans votre table de faits du trafic total pour l'indication IN/OUT & créer une table Dim pour les valeurs IN & Out. Vous pouvez ensuite analyser vos données en fonction de IN & Out.

1

Jetez également un oeil à this question, il décrit le même problème et il y a une réponse différente postée là.