在我的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 [Measures].[Growth in Commitments] = ([Measures].[Active Commitments],[Date Dimension].[Fiscal Year Hierarchy].currentMember) - ([Measures].[Active Commitments],[Date Dimension].[Fiscal Year Hierarchy].prevMember)[Measures].[Net Lost Commitments] = ([Measures].[Acquisitions] - [Measures].[Growth in Commitments])截图中的情况是,净损失的承付款总额是从收购总额(23,621)减去承诺的增长总额(即为零)计算出来的。
净损失承诺的汇总是有意义的,并适用于非时间维度。但是我希望它在选择多个时间段时显示为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]))ADVthanksANCE,
马特。
发布于 2013-02-19 03:47:56
另一个消息来源的建议帮我解决了这个问题。我可以用--
iif(iserror([Date Dimension].[Fiscal Year Hierarchy].CurrentMember),
, null
, [Measures].[Acquisitions] - [Measures].[Growth in Commitments]))当选择多个成员时,CurrentMember将返回一个错误。
发布于 2013-02-12 11:35:39
我不太理解问题的第一部分,sorry...but,最后我想您会问如何检测来自特定维度的多个成员是否正在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-07-24 17:00:31
我偶然看到这篇文章,当时我正在研究一个解决我自己问题的方法,当涉及过滤器的时候,计算出的测量值会随着时间的推移而累积起来。我认为你可以修正计算,而不是使用动态集来抑制它们。This worked for me。
https://stackoverflow.com/questions/14827654
复制相似问题