检查任何维层次结构中的级别是否为[Foo]

时间:2011-07-05 08:21:05

标签: ssas mdx cube dimension

在我的日期维度中,我有2个层次结构:

[年 - 周 - 日期] [年 - 月 - 日期]

如果日期维度的当前级别为[日期](最低级别)或更高级别,我想检查多维数据集计算。

我怎样才能做到这一点?

背景:我需要这个来计算一个员工在一个时期内的工作天数。 我目前有这个代码(未经测试)应该为1个层次结构做技巧,但我想当用户使用[年 - 周 - 日]层次结构时,这将失败。

CASE WHEN
    [Date].[Year - Month - Date].CURRENTMEMBER.Level
IS
    [Date].[Year - Month - Date].[Date]
THEN
    //at day level,

    //if there is any duration booked, this is a working day
    IIF([Measures].[Duration] = 0,0,1)

ELSE
    //at higher than day level,

    //count days
    COUNT(
        // where duration > 0 (employee work day)
        FILTER(
            Descendants([Date].[Year - Month - Date].CURRENTMEMBER, [Date].[Year - Month - Date].[Date]),
            [Measures].[Duration] > 0
        )
    )

END

tl; dr 如何使上述代码尽可能以最干净的方式适用于[年 - 周 - 日]层次结构。

4 个答案:

答案 0 :(得分:2)

让我们假设层次结构(又名属性)[日期]。[日期]存在。如果是这种情况,您可以简化:

  COUNT(
    FILTER( Existing [Date].[Date].members, [Measures].[Duration] > 0 )
  )

Existing将强制在[日期]维度上应用自动存在。这主要是性能提升,因为它无法评估(事实上)所有元组。

一旦前面的示例清楚,我们可以将它与您的版本合并,以获得最快的解决方案(不需要第一个iif):

  COUNT(
    FILTER( Existing 
       Descendants([Date].[Year - Month - Date].CURRENTMEMBER, [Date].[Year - Month - Date].[Date],self) 
       , [Measures].[Duration] > 0 )
  )

可以进一步改进添加具有不同聚合类型的新度量或添加iif以更改两个层次结构中的哪一个用于后代(例如,当前成员和默认成员不相等的那个)

答案 1 :(得分:1)

如果您正在寻找最简洁的方法来计算一段时间内的工作日数,您必须模拟常规测量的行为。否则,如果在[日期]上进行多重选择,您将收到错误或错误数据。另外,希望摆脱Count(Filter(...))表达式以保持块计算模式(参见Optimizing Count(Filter(...)) expressions in MDX)。为此,请按照下列步骤操作:

  1. 转到数据源视图。
  2. 在[持续时间]列旁边(在同一个事实表中)创建一个新的命名计算。
  3. 列名称为“工作日”,表达式为“null”。
  4. 根据“工作日”列创建新的常规指标。聚合函数是Sum。
  5. 在MDX脚本中写入:

    (
        [Date].[Date].[Date].Members,
        [Measures].[Working days]
    ) = Iif( [Measures].[Duration] > 0, 1, null );
    

答案 2 :(得分:1)

IsLeaf()会告诉您会员是否在底层。

答案 3 :(得分:0)

在计算脚本中查看SCOPE命令,我为YMD日历和YWD日历做了类似的事情:

CREATE MEMBER CurrentCube.Measures.Example AS NULL //Dummy will be calc'd later

SCOPE (DESCENDANTS([Date].[Calender Y M D],,AFTER));    
 Measures.Example = 1; //Fill in for monthly calcs
END SCOPE

SCOPE (DESCENDANTS([Date].[Calender Y W D],,AFTER));    
 Measures.Example = 2; //Fill in for weekly calcs
END SCOPE

如果我记得正确的话,使用,, AFTER的语法是排除所有成员,我正在尝试将链接扩展但无法找到它。或者,如果计算适用于ALL成员,则只需使用SCOPE([Date].[Calender Y W D])