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

时间:2013-02-12 07:37:45

标签: ssas mdx

在我的SSAS多维数据集中,我在MDX中定义了几个措施,除了在一段时间内的一种聚合外,它们工作正常。有些不聚合(并不意味着),但有人聚合但却给出了错误的答案。我可以看到为什么,但不知道如何防止它。

下面的Excel屏幕截图中突出显示的总数(该死的,不允许包含图片,还原到旧式表格)是出错的最简单的情况。在这个例子中,23,621 总计5,713和6,837。

       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 
  1. 有效承诺正常。它是针对某个时间点计算的,不应跨时间段汇总。
  2. 收购工作正常。
  3. [Measures].[Growth in Commitments] = ([Measures].[Active Commitments],[Date Dimension].[Fiscal Year Hierarchy].currentMember) - ([Measures].[Active Commitments],[Date Dimension].[Fiscal Year Hierarchy].prevMember)
  4. [Measures].[Net Lost Commitments] = ([Measures].[Acquisitions] - [Measures].[Growth in Commitments])
  5. 屏幕截图中发生的情况是,净损失承诺总额是根据收购总额(23,621)减去承诺增长总额(无效)计算的。

    净损失承诺的汇总是有意义的,适用于非时间维度。但我希望它在选择多个时间段而不是错误值时显示null。请注意,这与仅在时间维度上禁用所有聚合不同。 Net Lost Commitment的汇总在时间层次结构中工作正常 - 屏幕截图显示了2009年和2010年的正确值,如果您扩展到季度或月份,您仍然可以获得正确的值。只有在选择了多个时间段时,聚合才会失败。

    所以我的问题是如何更改Net Lost Commitments的定义,以便在选择多个时间段时不会聚合,而是继续在所有其他维度上聚合?例如,有没有一种在MDX中编写的方法:

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

    ADVthanksANCE,

3 个答案:

答案 0 :(得分:2)

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

iif(iserror([Date Dimension].[Fiscal Year Hierarchy].CurrentMember), 
   , null
   , [Measures].[Acquisitions] - [Measures].[Growth in Commitments]))

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

答案 1 :(得分:1)

我对问题的第一部分不太了解,抱歉......但最后我想你问如何检测MDX中是否有多个特定维度的成员在使用。

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

我建议使用InStr(1, SetToStr(StrToSet("Axis(1)")), "whatever") = 0来制作IIF的第一个参数。

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

要查看是否使用了同一维度的多个成员,上面的测试字符串必须更复杂。您想知道whatever是否出现一次或两次。您可以测试字符串的第一次出现是否与最后一次出现的位置相同(通过向后搜索);虽然这也可能意味着根本找不到字符串:

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

答案 2 :(得分:1)

我在研究自己的问题的解决方案时发现了这篇文章,其中涉及过滤器的计算度量的总计。我认为您可以修复计算而不是使用动态集来抑制它们。 This worked for me