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

时间:2017-06-29 22:00:55

标签: ssas mdx olap

如果我的某些术语出错了,请原谅我,我对MDX / OLAP相对较新。

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

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

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

白名单和黑名单层次结构分别包含有或无法访问问题的人的用户首字母。注意,事项要么是白名单,要么是黑名单,它绝不是两者的组合。

我能够相对轻松地解决无墙场景和白名单场景,但是黑名单场景存在很多问题。这是我到目前为止提出的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].&[]
    )
}) 

拆除并在表格中表示我正在过滤的初始数据集,如下所示:

enter image description here

我只想选择首字母 XXX 的用户可以访问的Ids。应用上面的过滤器,我得到了所有3 Ids。我要查找的结果集只有Id 12。上面的文件管理器匹配如下:

enter image description here

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

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

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

enter image description here

2 个答案:

答案 0 :(得分:0)

为什么不能简化这个?

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

答案 1 :(得分:0)

我们找到了解决方案!!

利用集合:

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) 

不再为我哭泣。