2017-06-22 4 views
1

Cela devrait être simple, je n'arrive juste pas à comprendre comment le faire.Teste si le membre existe dans la dimension

Je suis en train de calculer une mesure qui utilise PrevMember dans une dimension temporelle. Je voudrais montrer NULL si la dimension [Time] .CurrentMember n'a pas PrevMember.

Je n'arrive juste pas à comprendre ce qu'il faut entourer de cette expression membre pour dire "est-ce que ce membre existe réellement?". Je ne suis pas intéressé de savoir s'il existe une mesure particulière contre ce .PrevMember (c'est-à-dire EXISTING ou EXISTS). Je ne veux pas faire référence à la dimension des mesures - il suffit de tester si [Dimension temporelle] .CurrentMember.PrevMember renvoie un membre quelconque dans la dimension.

EDIT La mesure calculée en question est

([ThisPeriod] -PriorPeriod)/PriorPeriod

donc je veux attraper les cas où il n'y a pas de période antérieure (à tous les niveaux de la hiérarchie temporelle) et forcez le résultat à 0 plutôt que d'obtenir une sorte d'erreur (div/0?).

+0

tester Peut-être que le CurrentMember est le premier élément dans la dimension (si elle est tout d'abord il ne peut pas avoir un PrevMember). Ou même si CurrentMember.PrevMember est null devrait le faire. –

Répondre

2

Ce produit 0 où le CurrentMember ne dispose pas d'un membre précédent, tout les niveaux.

WITH MEMBER [Measures].[ThisPeriod] AS 3 
    MEMBER [Measures].[PriorPeriod] AS 2 
    MEMBER [Measures].[NewMeasure] AS 
IIF([Date].[Calendar].CURRENTMEMBER.PREVMEMBER IS NULL,0,[Measures].[ThisPeriod] - [Measures].[PriorPeriod]) 
SELECT 
    {[Measures].[ThisPeriod], [Measures].[PriorPeriod], [Measures].[NewMeasure]} ON COLUMNS 
, [Date].[Calendar].MEMBERS ON ROWS 
FROM 
    [Adventure Works] 
    ; 

enter image description here

1

Vous n'êtes pas sûr de devoir faire quoi que ce soit - s'il n'y a pas de membre précédent, alors null sera retourné de toute façon?

WITH 
    MEMBER Measures.[CalendarPrevious] AS 
    [Date].Calendar.CurrentMember.PrevMember.Member_Caption 
    MEMBER Measures.[CalendarPrevious2] AS 
    IIF 
    (
     Count({[Date].Calendar.CurrentMember.PrevMember}) = 1 
    ,[Date].Calendar.CurrentMember.PrevMember.Member_Caption 
    ,null 
    ) 
SELECT 
    NON EMPTY 
    { 
     Measures.[CalendarPrevious] 
    ,Measures.[CalendarPrevious2] 
    } ON 0 
,[Date].[Calendar].[Date].MEMBERS ON 1 
FROM [Adventure Works]; 

Retours:

enter image description here

Pour lutter contre les erreurs div J'utilise généralement ce modèle:

MEMBER [Date].[Date - Calendar Month].[All].[DlyAvgGrowth] AS 
    IIF 
    (
     [Date].[Date - Calendar Month].[All].[PrevMth_DlyAvg] = 0 
    ,NULL 
    ,Divide 
     (
      [Date].[Date - Calendar Month].[All].[CurrentMth_DlyAvg] 
     - 
      [Date].[Date - Calendar Month].[All].[PrevMth_DlyAvg] 
     ,[Date].[Date - Calendar Month].[All].[PrevMth_DlyAvg] 
    ) 
    ) 
+0

C'est plus compliqué que ça. Question éditée pour clarifier. – SebTHU

+0

pourquoi votre mesure produirait-elle une erreur div/0? Cela semble être une mesure moins une autre. Je pense que si l'un d'eux est NULL, il retournera NULL. –

+0

@TheDumbRadish: désolé, l'éditeur a automatiquement modifié mon edit dans une sorte de lien hypertexte, donc il n'était pas clair qu'il s'agit de (CurrentPeriod-PriorPeriod)/PriorPeriod. Fixé avec un autre edit. – SebTHU