ICCube MDX技术问题:带WHERE子句的成员计数及查询异常
嘿,我来帮你解决这两个ICCube的MDX问题,都是MDX新手常踩的坑,咱们一个个来捋:
问题1:如何在MDX中使用WHERE子句计算成员数量?
WHERE子句在MDX里是做切片的,它会限定整个查询的上下文,但直接用[维度].[层级].Count的话,默认是取整个层级的成员总数,不会自动应用WHERE的筛选逻辑。要计算符合WHERE切片条件的成员数量,你需要让计数逻辑感知当前的查询上下文,常用的两种方法:
- 方法一:用
Existing关键字绑定上下文Existing会把当前查询的上下文(包括WHERE的切片)应用到目标成员集合上,再进行计数。比如统计WHERE筛选后的有效年份数:
WITH MEMBER [Measures].[Filtered Year Count] AS COUNT(EXISTING [Time].[Year].[Year].Members) SELECT [Measures].[Filtered Year Count] ON 0 FROM [Sales] WHERE [Time].[2007] -- 切片条件会被Existing感知
- 方法二:基于度量存在性计数(适合统计有数据的成员)
如果你需要的是有销售数据的成员数量,可以用Filter结合IsEmpty判断,此时WHERE的切片会影响度量的计算结果,从而自动过滤成员:
WITH MEMBER [Measures].[Non-Empty Year Count] AS COUNT(FILTER([Time].[Year].[Year].Members, NOT ISEMPTY([Measures].[Sales Amount]))) SELECT [Measures].[Non-Empty Year Count] ON 0 FROM [Sales] WHERE [Region].[Europe] -- 切片后只统计欧洲区域有销售的年份
问题2:WHERE子句未生效,返回总年份数的解决方法
先分析问题根源:你写的[Time].[Year].[Year].Count是直接取[Time].[Year]层级下所有成员的总数,这个计算逻辑完全脱离了WHERE子句的切片上下文——MDX中计算成员的默认上下文是整个维度层级,除非你明确指定要绑定当前查询的上下文。
解决方法非常直接,就是用Existing关键字让计数逻辑感知WHERE的切片:
WITH MEMBER nbYears AS COUNT(EXISTING [Time].[Year].[Year].Members) SELECT nbYears ON 0 FROM [Sales] WHERE [Time].[2007]
这样修改后,Existing会把WHERE里的[Time].[2007]上下文应用到成员集合,此时集合里只有2007这一个成员,计数结果就会是1,而不是总年份数。如果你的WHERE是范围筛选(比如[Time].[2006]:[Time].[2008]),这个写法也会返回符合范围的年份数量,灵活性拉满。
内容的提问来源于stack exchange,提问作者Bertrand Miot
相关产品推荐
相关产品推荐

