MDX多条件筛选查询求助:实现类似SQL或逻辑的维度组合筛选
MDX查询实现多维度OR逻辑筛选
我明白你遇到的问题了——单维度筛选没问题,但要实现OR逻辑的多维度组合筛选确实和SQL的思路不太一样。MDX里的交叉连接(*)是AND逻辑,而你需要的是两个条件的并集,我们可以用Union()函数或者Filter()函数来实现。
方法一:用Union()实现高效的OR逻辑(推荐)
这个方法直接合并两个符合条件的成员集合,性能更优,适合你的场景:
SELECT {[Measures].AllMembers} ON COLUMNS, NON EMPTY Union( -- 第一个集合:所有CodGer为A的成员 {[ModelosGers].[CodGer].[A].Members}, -- 第二个集合:所有CodModel为B01的成员 {[ModelosGers].[CodModel].[B01].Members} ) ON ROWS FROM [Tasas] WHERE {[Periodos].[Periodos].[Periodos].[260]}
说明:
Union()函数会把两个集合的成员合并,自动去重(如果有成员同时满足CodGer=A和CodModel=B01,只会出现一次)。- 如果你的
CodGer是父层级,下面包含多个CodModel,那么[ModelosGers].[CodGer].[A].Members会返回A下的所有子成员,正好符合你"CodGer为A"的需求。
方法二:用Filter()实现灵活的条件筛选
如果你的筛选条件更复杂,或者不确定具体成员路径,可以用Filter()遍历维度成员并判断条件:
SELECT {[Measures].AllMembers} ON COLUMNS, NON EMPTY Filter( -- 遍历ModelosGers维度的所有成员 [ModelosGers].[ModelosGers].AllMembers, -- 判断当前成员是否满足任一条件 [ModelosGers].[CodGer].CurrentMember.Name = 'A' OR [ModelosGers].[CodModel].CurrentMember.Name = 'B01' ) ON ROWS FROM [Tasas] WHERE {[Periodos].[Periodos].[Periodos].[260]}
说明:
Filter()会逐个检查维度成员,符合条件的才会被保留。这种方式更灵活,但如果维度成员数量很大,性能可能不如Union()。
为什么原来的查询不能实现OR逻辑?
你之前用的[ModelosGers].[CodGer].[A] * [ModelosGers].[CodModel].[A01]是交叉连接,相当于SQL里的AND逻辑——只有同时满足CodGer=A和CodModel=A01的成员才会被选中,这和你需要的OR逻辑正好相反。
内容的提问来源于stack exchange,提问作者erpota
相关产品推荐
相关产品推荐

