MDX 系列 - 在集合中实现 NOT IN 逻辑 (Minus, Except, Filter 等符号和函数的使用)

浏览: 3001

有时需要从一些查询结果里排除掉一些成员,当然平常情况下可以通过 MDX 查询中的 WHERE 条件即 Slicer 切片来完成,同样的这里显示的是如何在切片中排除掉一些成员。

先看这一个查询 -

SELECT { [Measures].[Reseller Order Count] } ON 0,
NON EMPTY {[Promotion].[Promotion].MEMBERS }
DIMENSION PROPERTIES [Promotion].[Promotion].[Discount Percent]
ON 1
FROM [Adventure Works]

上面的查询返回了12个 Promotion 成员,DIMNSION PROPERTIES 关键字用来获取有关成员的属性信息 - Discount Percent。

可以双击成员查看它们的属性信息,例如双击 No Discount 成员可以看到它的成员属性 -

 

下面我们要做的就是排除掉  [Promotion].[Promotion].[Discount Percent]  成员属性值为0,2 和 5 的成员。

 

 

 

添加 WHERE 条件

SELECT { [Measures].[Reseller Order Count] } ON 0,
NON EMPTY {[Promotion].[Promotion].MEMBERS }
DIMENSION PROPERTIES [Promotion].[Promotion].[Discount Percent]
ON 1
FROM [Adventure Works]
WHERE ( -
{
[Promotion].[Discount Percent].&[0],
[Promotion].[Discount Percent].&[2.E-2],
[Promotion].[Discount Percent].&[5.E-2]
}
)

打开 Promotion 维度找到 Discount Percent 然后将 0,2,5 三个值拖放过来,最后用 - 号表示要排除

最终 'No Discount', 'Volume Discount 11 to 14', 'Volumn Discount 15 to 24' 这几个成员就被排除掉了。

在最开始的查询中并没有使用任何的切片 Slicer 去过滤层次结构轴上的任何成员,但是也不需要显示的写出来,因为 SSAS 有一套元组的自动填充规则来将局部元组补充完全。通过 WHERE 条件我们使用到了切片的概念,它实则就是在层次结构轴上排除掉了'No Discount', 'Volumn Discount 11 to 14', 'Volumn Discount 15 to 24' 这几个成员,那么整个 Cube 空间的形成自然也将排除掉由这几个成员与其它层次结构轴构成的轴空间。

我们也可以使用 Except 函数来实现同样的结果:

SELECT { [Measures].[Reseller Order Count] } ON 0,
NON EMPTY {[Promotion].[Promotion].MEMBERS }
DIMENSION PROPERTIES [Promotion].[Promotion].[Discount Percent]
ON 1
FROM [Adventure Works]
WHERE EXCEPT(
{[Promotion].[Discount Percent].[Discount Percent].MEMBERS},
{
[Promotion].[Discount Percent].&[0],
[Promotion].[Discount Percent].&[2.E-2],
[Promotion].[Discount Percent].&[5.E-2]
}
)

EXCEPT ({SET 1},{SET 2}) 函数的作用就是取得 SET 1 没有在 SET 2 中出现的那部分成员形成的集合,注意返回的是 SET 1 中的成员。

在这个例子中,Discount Percent 属性中定义了 MemberValue 值,因此还可以通过 Filter 函数来实现 NOT IN 的逻辑。

SELECT { [Measures].[Reseller Order Count] } ON 0,
NON EMPTY {[Promotion].[Promotion].MEMBERS }
DIMENSION PROPERTIES [Promotion].[Promotion].[Discount Percent] ON 1
FROM [Adventure Works]
WHERE
(
{ FILTER(
[Promotion].[Discount Percent].[Discount Percent].MEMBERS,
[Promotion].[Discount Percent].CurrentMember.MemberValue >= 0.1
)
}
)

但是要注意,这里在 FILTER 中的条件表达式的前提是 [Promotion].[Discount Percent].CurrentMember.MemberValue 中的值确实是连续的,如果不是连续的已经排过序的值,那么就不可以使用 Filter 来实现这个例子。

推荐 0
本文由 BIWORK 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册