代码改变世界

MDX Cookbook 07 - 在不同层次结构的成员中实现 逻辑 OR 的效果

2013-12-02 23:50  BIWORK  阅读(737)  评论(0编辑  收藏  举报

第一个示例:查看所有包括黑色产品的子目录产品中的 Reseller Order Quantity 和 Reseller Order Count。

 

第二个示例:和第一个示例查询结构一样,只是筛选的是大小为 XL 的产品子目录,并且只有 Jerseys 一个返回。

那么如果要在这里面表达 OR 的关系,即产品为黑色的或者大小为 XL 的产品子目录有哪些? 可以这样来实现 -

SELECT {
               [Measures].[Reseller Order Quantity],
               [Measures].[Reseller Order Count]
   } ON 0,
NON EMPTY {[Product].[Subcategory].MEMBERS} ON 1
FROM [Adventure Works]
WHERE
(
  {
    ([Product].[Color].&[Black],[Product].[Size Range].[All Products]),
    ([Product].[Color].[All Products], [Product].[Size Range].&[XL])
  }
)

这其中的关联非常有意思,是通过一个由两个元组组成的集合形成的。

{
([Product].[Color].&[Black],[Product].[Size Range].[All Products]),
([Product].[Color].[All Products], [Product].[Size Range].&[XL])
}

那么对于逻辑 OR 的实现,首先要理解的是它应该要被表达成集合的形式。由于我们的成员实际上来自于不同的维度,所以我们首先需要将这些成员转变成元组 Tuple,并且这些元组必须在维度层次结构上和元组顺序一致这样就形成了一个集合。实现的过程就是使用自己当前的成员与另外一个过滤条件成员的根成员共同形成一个元组,另外一个也是如此,这样一个集合就出来了。

在这个例子中其实也可以看到 Auto-Exist 机制的影响,可以参看我的这篇博客 - http://www.cnblogs.com/biwork/archive/2013/04/16/3023693.html

有一个特别要注意的地方,如果维度中没有像 [All Products]这样的根成员,或者设置了 IsAggregatable = False,那么这时就应该使用它的默认成员来代替。

其它 BI 博客系列看参看 - BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)