MDX 排除层次结构中存在值的结果

Posted

技术标签:

【中文标题】MDX 排除层次结构中存在值的结果【英文标题】:MDX Exclude results where a value exists in a hierarchy 【发布时间】:2017-06-29 22:00:55 【问题描述】:

如果我弄错了一些术语,请原谅,我对 MDX/OLAP 比较陌生。

我有一个确定道德墙的维度。维度如下所示:

Ethical Wall (dimension)
   --> Matter ID (hierarchy)
   --> Walled (hierarchy)
   --> White Listed Initials (hierarchy)
   --> Black Listed Initials (hierarchy)

[Walled] 层次结构包含真或假,具体取决于问题是否应用了墙。

白名单和黑名单层次结构分别包含有权或无权访问某事项的人员的用户姓名首字母。请注意,事项不是列入白名单,就是列入黑名单,绝不是两者兼而有之。

我已经能够相对容易地解释无墙场景和白名单场景,但是黑名单场景有很多问题。这是我到目前为止提出的 where 子句:

(
    (
        [Ethical Wall].[Walled].&[True]
        ,[Ethical Wall].[White Listed Initials].&[XXX]
        ,[Ethical Wall].[Black Listed Initials].&[]
    )
    ,(
        [Ethical Wall].[Walled].&[True]
        ,[Ethical Wall].[White Listed Initials].&[]
        ,-[Ethical Wall].[Black Listed Initials].&[XXX]
    )
    ,(
        [Ethical Wall].[Walled].&[False]
        ,[Ethical Wall].[White Listed Initials].&[]
        ,[Ethical Wall].[Black Listed Initials].&[]
    )
) 

剥离并在表格中表示它,我从中过滤的初始数据集看起来像这样:

我只想选择姓名首字母为 XXX 的用户可以访问的Ids。从上面应用过滤器,我得到了所有 3 个Ids。我要找的结果集只有Id12。上面的文件管理器是这样匹配的:

我了解为什么我的过滤器正在检索所有 3 个 Ids,但我不明白如何修改过滤器的中间部分以正确排除 Ids。这是过滤器的违规部分:

    ,(
        [Ethical Wall].[Walled].&[True]
        ,[Ethical Wall].[White Listed Initials].&[]
        ,-[Ethical Wall].[Black Listed Initials].&[XXX]
    )

如何修改我的过滤器以匹配这样的数据集?

【问题讨论】:

那么为什么要包含中间元组呢?如果中间元组正在选择您不想选择的内容,那么只需从集合中删除该元组? 因为我从中过滤的初始数据集包含所有 Id,所以我将编辑问题以包含该信息。 【参考方案1】:

你为什么不能简化到这个?

WHERE
(
    (
        [Ethical Wall].[Walled].&[True]
        ,[Ethical Wall].[White Listed Initials].&[XXX]
    )
    ,(
        [Ethical Wall].[Walled].&[False]
        ,[Ethical Wall].[White Listed Initials].&[]
    )
);

【讨论】:

我的理解是使用 WHERE 子句会降低性能。对吗?【参考方案2】:

我们找到了解决办法!!

利用集合:

SET notwalled AS exists( 
       selectedmatters, 
        
         [Ethical Wall].[Walled].&[False] 
        
     ) 
  SET whitelisted AS exists( 
       selectedmatters, 
        
         [Ethical Wall].[White Listed Initials].&[XXX] 
        
     ) 
  SET blacklisted AS EXCEPT( 
       selectedmatters, 
       exists( 
         selectedmatters, 
          
           [Ethical Wall].[Black Listed Initials].&[XXX], 
           [Ethical Wall].[Black Listed Initials].&[] 
          
       ) 
     ) 

然后联合:

UNION(notwalled, whitelisted, blacklisted) 

别再为我哭了。

【讨论】:

以上是关于MDX 排除层次结构中存在值的结果的主要内容,如果未能解决你的问题,请参考以下文章

MDX 获取层次结构值

在 Drupal 中使用显示层次结构值的分类参数创建视图

如果当前成员有孩子,则展开用户层次结构 - MDX

如何根据 mdx 中的另一个维度层次结构过滤维度层次结构

SSAS MDX WHERE 子句语法 - 从同一层次结构中过滤多个值

具有多个属性层次结构的计算成员 - MDX