3

在我的 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])

屏幕截图中发生的情况是,净损失承诺总额是根据收购总额 (23,621) 减去承诺增长总额(为空)计算得出的。

净损失承诺的聚合是有意义的,适用于非时间维度。但是我希望它在选择多个时间段而不是错误值时显示为空。请注意,这与简单地禁用时间维度上的所有聚合不同。Net Lost Commitment 的聚合在时间层次结构上工作得很好——屏幕截图显示了 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]))

高级感谢,

马特。

4

3 回答 3

2

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

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

CurrentMember 将在选择多个成员时返回错误。

于 2013-02-19T03:47:56.933 回答
1

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

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

我建议InStr(1, SetToStr(StrToSet("Axis(1)")), "whatever") = 0作为一种方法来制作你的第一个参数IIF

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

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

IIF(
   InStr(1, bigstring, littlestring) = InStrRev(bigstring, littlestring), 
   'used once', 
   'used twice or not at all'
)
于 2013-02-12T11:35:39.510 回答
1

我在研究我自己的问题的解决方案时遇到了这篇文章,当涉及过滤器时,随着时间的推移计算测量的总数。我认为您可以修复计算,而不是通过使用动态集来抑制它们。这对我有用

于 2013-07-24T17:00:31.890 回答