如何在MDX中为计算成员添加多条件筛选(icCube环境)
在icCube的MDX中计算指定日期在场的非重复人员数
需求背景
现有多维立方体包含[Person]、[Arrival Date]、[Departure Date]三个维度,以及统计[Person]非重复计数的度量[Measures].[persons #D]。需要计算[Measures].[EndOfPeriodDate]指定日期当天“在场”的人员数,即筛选出抵达日期早于该日期且离开日期晚于该日期的人员。
正确MDX实现方式
方法1:利用维度范围组合(推荐,性能更优)
直接将两个维度的筛选范围组合成元组,传递给AGGREGATE函数,同时满足两个条件:
CREATE MEMBER [Measures].[PersonsAtEndOfPeriod] AS AGGREGATE( ( -- 筛选所有早于指定日期的抵达日期 NULL : [Arrival Date].[Arrival Date].[Day].LookupByName([Measures].[EndOfPeriodDate]), -- 筛选所有晚于指定日期的离开日期 [Departure Date].[Departure Date].[Day].LookupByName([Measures].[EndOfPeriodDate]) : NULL ), [Measures].[Persons #D] )
- 注意:MDX中同时筛选多个维度时,需将各维度的筛选范围放在同一元组内(用括号包裹,逗号分隔),而非用
+拼接,这是你之前写法出错的核心原因。 - 若
LookupByName因日期格式匹配问题失效,可改用StrToMember函数确保日期字符串正确关联维度成员:CREATE MEMBER [Measures].[PersonsAtEndOfPeriod] AS AGGREGATE( ( NULL : StrToMember("[Arrival Date].[Arrival Date].[Day].&[" + [Measures].[EndOfPeriodDate] + "]"), StrToMember("[Departure Date].[Departure Date].[Day].&[" + [Measures].[EndOfPeriodDate] + "]") : NULL ), [Measures].[Persons #D] )
方法2:遍历Person成员筛选(逻辑更贴近DAX的FILTER)
通过FILTER函数遍历所有Person成员,判断每个人员的抵达/离开日期是否符合条件,再统计数量:
CREATE MEMBER [Measures].[PersonsAtEndOfPeriod] AS COUNT( FILTER( [Person].[Person].[Person].Members, -- 需确保这两个度量能返回对应人员的抵达/离开日期 [Measures].[Arrival Date] < [Measures].[EndOfPeriodDate] AND [Measures].[Departure Date] > [Measures].[EndOfPeriodDate] ) )
- 此方法逻辑直观,但性能不如维度范围筛选,适合数据量较小的场景。
内容的提问来源于stack exchange,提问作者megalap
相关产品推荐
相关产品推荐

