Ssas 选择多个时间段时MDX计算度量值的聚合

Ssas 选择多个时间段时MDX计算度量值的聚合,ssas,mdx,Ssas,Mdx,在我的SSAS多维数据集中,我在MDX中定义了几个度量值,除了跨时间段的一种聚合之外,这些度量值工作得很好。有些人不会聚合(也不是有意聚合),但有人聚合了,但给出了错误的答案。我知道原因,但不知道如何预防 下面Excel屏幕截图中突出显示的总数(该死,不允许包含图像,恢复到旧样式表)是最简单的错误情况。在这个例子中,23621不是5713和6837的总和 Active Commitments Acquisitions Net Lost Commitments Gr

在我的SSAS多维数据集中,我在MDX中定义了几个度量值,除了跨时间段的一种聚合之外,这些度量值工作得很好。有些人不会聚合(也不是有意聚合),但有人聚合了,但给出了错误的答案。我知道原因,但不知道如何预防

下面Excel屏幕截图中突出显示的总数(该死,不允许包含图像,恢复到旧样式表)是最简单的错误情况。在这个例子中,23621不是5713和6837的总和

       Active Commitments    Acquisitions    Net Lost Commitments    Growth in Commitments
2009   88,526                13,185          5,713                   7,472
2010   92,125                10,436          6,837                   3,599
Total                        23,621          23,621 
  • 积极的承诺很好。它是针对某个时间点计算的,不应跨时间段进行聚合
  • 收购运作良好
  • [Measures].[Growth in commissions]=([Measures].[Active commissions],[Date Dimension].[Fiscal Year Hierarchy].currentMember)-([Measures].[Active commissions],[Date Dimension].[Fiscal Year Hierarchy].prevMember)
  • [Measures].[净损失承诺]=([Measures].[收购]-[Measures].[承诺增长])
  • 截图中的情况是,净损失承诺总额是从收购总额(23621)减去承诺增长总额(为空)计算得出的

    净损失承诺的聚合是有意义的,并且适用于非时间维度。但我希望它在选择多个时间段时显示null,而不是错误的值。请注意,这与简单地禁用时间维度上的所有聚合不同。净损失承诺的聚合可以优化时间层次结构——屏幕截图显示了2009年和2010年的正确值,如果扩展到季度或月份,仍然可以得到正确的值。只有在选择多个时间段时,聚合才会失败

    因此,我的问题是,如何更改净损失承诺的定义,使其在选择多个时间段时不会聚合,而是在所有其他维度上继续聚合?例如,是否有一种在MDX中编写的方法:

    CREATE MEMBER CURRENTCUBE.[Measures].[Net Lost Commitments]
     AS (iif([Date Dimension].[Fiscal Year Hierarchy].**MultipleMembersSelected**
            , null
            , [Measures].[Acquisitions] - [Measures].[Growth in Commitments]))
    
    忠告


    Matt。

    我不太理解问题的第一部分,抱歉……但最后我想你会问如何检测MDX中是否使用了来自特定维度的多个成员

    您可以将两个轴中的任意一个作为字符串进行检查,并使用该字符串形成真/假测试。请记住,您可以在MDX的Microsoft实现中使用VBA函数

    我建议
    InStr(1,SetToStr(stroset(“Axis(1)”),“whatever”)=0
    作为构建
    IIF
    的第一个参数的方法

    这将获取轴1上的成员集,将其转换为字符串,并查看是否存在某个字符串(返回该字符串在另一个字符串中的位置)。零表示找不到(因此返回true)。您可能需要使用轴零,或者可能同时选中这两个选项

    要查看是否使用了来自同一维度的多个成员,上面的测试字符串必须更加复杂。您想知道
    无论什么
    发生一次还是两次。您可以测试字符串的第一次出现是否与最后一次出现在同一位置(通过向后搜索);尽管这也可能意味着根本找不到字符串:

    IIF(
       InStr(1, bigstring, littlestring) = InStrRev(bigstring, littlestring), 
       'used once', 
       'used twice or not at all'
    )
    

    另一个消息来源的建议为我解决了这个问题。我可以用--


    当选择多个成员时,CurrentMember将返回错误

    我是在为自己的问题研究一个解决方案时发现这篇文章的,当涉及到过滤器时,随着时间的推移,计算出了大量的度量值。我认为你可以通过使用动态集来修正计算,而不是抑制它们

    谢谢马格纳斯。我将在接下来的几天内尝试这个方法,并将我的发现发布到这里。在尝试实施这个建议之后,马格纳斯,我看不出它有效,因为日期维度经常在切片器中,而不是在任何一个轴上。我也许可以编写一个复杂的IIF语句,在轴0或轴1上查找“[Date Dimension]”的多次出现,但我认为“where”子句的内容不能以相同的方式访问。哦,天哪。很抱歉我正要建议您使用InStr()中的.currentMember来检查正在计算的当前元组……但我在上面看到您已经发现了这一点!另一个想法。。。定义度量的MDX在SSAS多维数据集的“计算”脚本中。因此,也许我可以通过SCOPE语句来实现,而不是限制度量定义本身中的聚合。在SCOPE语句中是否有一种方式可以说“只有当上下文是[Date维度]的单个成员时,才会应用此块”?
    iif(iserror([Date Dimension].[Fiscal Year Hierarchy].CurrentMember), 
       , null
       , [Measures].[Acquisitions] - [Measures].[Growth in Commitments]))