Ssas MDX,其中IN()在多对多维度中不等效

Ssas MDX,其中IN()在多对多维度中不等效,ssas,mdx,Ssas,Mdx,我的多维数据集中有一个多对多维度(紧挨着其他常规维度)。当我想在行计数度量中排除事实行时,我通常在MDX中执行如下操作 SELECT [Measures].[Row Count] on 0 FROM cube WHERE ([dimension].[attribute].Children - [dimension].[attribute].&[value]) 在这个简单的例子中,这看起来可能比需要的更复杂,但在这种情况下,有时可能会增长,也包括工会 这适用于规则维度,但现在我有一个多对

我的多维数据集中有一个多对多维度(紧挨着其他常规维度)。当我想在行计数度量中排除事实行时,我通常在MDX中执行如下操作

SELECT [Measures].[Row Count] on 0
FROM cube
WHERE ([dimension].[attribute].Children - [dimension].[attribute].&[value])
在这个简单的例子中,这看起来可能比需要的更复杂,但在这种情况下,有时可能会增长,也包括工会

这适用于规则维度,但现在我有一个多对多维度。如果我执行上面的技巧,它不会产生期望的结果,也就是说,我希望排除在多对多维度中具有该特定属性的所有行

实际上,它完全按照MDX的要求执行,即统计所有行,但忽略指定的属性。由于事实表中的一行可以在多对多维度中具有多个属性,因此该行仍将被计数

这不是我需要的,我需要它显式地排除具有该维度属性值的行。此外,我可能会排除多个值。所以我需要的是类似于T-SQL的WHERE。。不在(…)

我意识到我可以从[attribute].all和[attribute].&[value]中减去结果值,但当联合多个WHERE语句时,这将不再有效

有人知道怎么解决这个问题吗

提前感谢,


Delta

您是否尝试过EXCEPT命令?其语法如下所示:


除了({我想要的集合},{我不想要的成员集合})

我还没有测试过这个,但是我认为如果您有一个与行粒度相同的属性(因此可能实现为事实关系),那么您可以这样做

因此,如果您想计算没有自行车产品类别的订单数量(假设OrderID和类别之间存在M2M关系),那么类似于以下内容的方法应该可以工作。(您可以在联机丛书中找到有关EXISTS功能的更多信息)


尽管它可能会非常慢,因为这种查询会迫使SSAS引擎从较低的级别添加大量事实。

您可以使用过滤功能:

SELECT [Measures].[Row Count] on 0
FROM [cube]
WHERE Filter([dimension].[attribute].Children, [dimension].CurrentMember.MemberValue <> value)
在0上选择[Measures].[Row Count]
从[立方体]
其中筛选器([dimension].[attribute].Children[dimension].CurrentMember.MemberValue)

谢谢您的回答。是的,事实上我刚刚又测试了一次(但我以前试过)。基本上,它的构造与:[dimension].[attribute].Children-[dimension].[attribute].&[value])相同,因为这是一个多对多维度,一行可以指向多个维度成员。当它有另一个属性(我没有特别排除)时,该行将被计数。我需要它专门排除在其他可能值中有一个值的行。在常规维度中,这个问题不存在,因为一行只能指向一个维度成员。排除该成员的属性值,该行也被排除。但是,同样,这是一个多对多维度。减号运算符只是另一种语法,用于除外(就像*与交叉连接相同)
SELECT [Measures].[Row Count] on 0
FROM [cube]
WHERE Filter([dimension].[attribute].Children, [dimension].CurrentMember.MemberValue <> value)