MDX WHERE NOT IN()在多对多维度中等效

时间:2009-12-16 15:22:22

标签: ssas mdx

我的立方体中有多对多维度(在其他常规维度旁边)。当我想在行计数度量中排除事实行时,我通常会在MDX

中执行以下操作
SELECT [Measures].[Row Count] on 0
FROM cube
WHERE ([dimension].[attribute].Children - [dimension].[attribute].&[value])

这可能看起来比这个简单示例中的需要更复杂,但在这种情况下,WHERE有时会增长,也包括UNION。

所以这适用于常规尺寸,但现在我有多对多的尺寸。如果我执行上面的技巧,它不会产生所需的结果,即我想排除在多对多维度中具有该特定属性的所有行。

实际上它确实是MDX要求的,即计算所有行,但忽略指定的属性。由于事实表中的行可以在多对多维度中具有多个属性,因此仍将对该行进行计数。

这不是我需要的,我需要它明确地排除具有该维度属性值的行。另外,我可能会排除多个值。所以我需要的是类似于T-SQL的WHERE .. NOT IN(...)

我意识到我可以从[attribute] .all和[attribute]。& [value]中减去结果值,但是当UNIONing多个WHERE语句时,它将不再起作用。

有人知道如何解决这个问题吗?

提前致谢,

德尔塔

3 个答案:

答案 0 :(得分:1)

我没有对此进行过测试,但我认为如果你的属性与行的粒度级别相同(可能实现为事实关系),我认为你可以这样做。

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

[Orders].[Order ID].[Order ID].Members 
- EXISTS([Orders].[Order ID].[Order ID].Members
       , [Product].[Category].&[Bikes]
       , "Order Facts")

虽然这可能会很慢,因为这种查询迫使SSAS引擎从低级别添加大量事实。

答案 1 :(得分:0)

您是否尝试过EXCEPT命令?它的语法如下:

EXCEPT({the set i want}, {a set of members i dont want})

答案 2 :(得分:0)

您可以使用过滤功能:

SELECT [Measures].[Row Count] on 0
FROM [cube]
WHERE Filter([dimension].[attribute].Children, [dimension].CurrentMember.MemberValue <> value)