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

3
请原谅我如果术语有误,因为我对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

那么为什么要包含中间元组呢?如果中间元组选择了你不想选择的内容,那就从集合中删除该元组即可。 - whytheq
因为我要从初始数据集中筛选出所有的ID,所以我会编辑问题并包含这些信息。 - Nate Anderson
2个回答

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) 

不再为我哭泣。


0
为什么你不能简化成这样呢?
WHERE
({
    (
        [Ethical Wall].[Walled].&[True]
        ,[Ethical Wall].[White Listed Initials].&[XXX]
    )
    ,(
        [Ethical Wall].[Walled].&[False]
        ,[Ethical Wall].[White Listed Initials].&[]
    )
});

我的理解是,使用WHERE子句会降低性能。这是正确的吗? - VKarthik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接