首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选定多个时间段时MDX计算度量的聚合

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

Stack Overflow用户
提问于 2013-02-12 07:37:45
回答 3查看 3.7K关注 0票数 3

在我的SSAS多维数据集中,我在MDX中定义了几个度量,它们可以很好地工作,除了在一种跨时间段的聚合中。有些人不聚合(也不是故意的),但是一个人确实聚合了,但却给出了错误的答案。我明白为什么,但不知道该怎么做才能阻止它。

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

代码语言:javascript
复制
       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)减去承诺的增长总额(即为零)计算出来的。

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

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

代码语言:javascript
复制
CREATE MEMBER CURRENTCUBE.[Measures].[Net Lost Commitments]
 AS (iif([Date Dimension].[Fiscal Year Hierarchy].**MultipleMembersSelected**
        , null
        , [Measures].[Acquisitions] - [Measures].[Growth in Commitments]))

ADVthanksANCE,

马特。

EN

回答 3

Stack Overflow用户

发布于 2013-02-19 03:47:56

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

代码语言:javascript
复制
iif(iserror([Date Dimension].[Fiscal Year Hierarchy].CurrentMember), 
   , null
   , [Measures].[Acquisitions] - [Measures].[Growth in Commitments]))

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

票数 2
EN

Stack Overflow用户

发布于 2013-02-12 11:35:39

我不太理解问题的第一部分,sorry...but,最后我想您会问如何检测来自特定维度的多个成员是否正在MDX中使用。

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

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

这将获取第一轴上的一组成员,将其转换为字符串,并查看是否存在某个字符串(它返回该字符串在另一个字符串中的位置)。零意味着找不到(所以它返回true)。您可能需要使用轴零代替,或可能检查两者。

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

代码语言:javascript
复制
IIF(
   InStr(1, bigstring, littlestring) = InStrRev(bigstring, littlestring), 
   'used once', 
   'used twice or not at all'
)
票数 1
EN

Stack Overflow用户

发布于 2013-07-24 17:00:31

我偶然看到这篇文章,当时我正在研究一个解决我自己问题的方法,当涉及过滤器的时候,计算出的测量值会随着时间的推移而累积起来。我认为你可以修正计算,而不是使用动态集来抑制它们。This worked for me

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14827654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档