MDX中如何将数据求和至当前日期?现有计算维度公式修改咨询
解决Cube中仅计算截至当前日期累计值的问题
你的原公式Sum(PeriodsToDate([Year].[Data].[(All)]), [Quantity])会计算从年初到当前时间成员的累计值,但因为时间维度包含未来年份数据,导致结果会包含未发生的部分。下面给你几个实用的MDX修改方案,按需选择:
方案1:过滤时间成员(最通用)
如果你的时间维度有日期级别的成员(比如[Year].[Data].[Date]),可以借助Today()(或Now(),取决于你的MDX引擎,比如SSAS里Today()仅返回日期,不带时间)获取当前日期,过滤出所有不晚于当前日期的成员后再求和:
Sum( Filter( PeriodsToDate([Year].[Data].[(All)]), -- 确保成员值能转换为日期,根据你的维度调整这里的转换逻辑 CDate([Year].[Data].CurrentMember.MemberValue) <= Today() ), [Quantity] )
如果你的时间成员的名称是日期格式,也可以用CDate([Year].[Data].CurrentMember.Name)来替代MemberValue。
方案2:利用预定义的当前日期成员(性能更优)
很多BI系统(比如SSAS)会在时间维度中预定义当前日期成员(通常命名为CurrentDateMember之类的),如果你的Cube有这个成员,直接用范围切片的方式限制时间范围,比Filter性能更好:
Sum( -- 取年初到当前日期成员的所有时间范围 PeriodsToDate([Year].[Data].[(All)]) * {[Year].[Data].[(All)]:[Year].[Data].CurrentDateMember}, [Quantity] )
方案3:简化的本年累计写法
如果你的需求就是截至当前日期的本年累计,可以用YTD()函数替代PeriodsToDate,写法更简洁:
Sum( Filter( YTD([Year].[Data].CurrentMember), CDate([Year].[Data].CurrentMember.MemberValue) <= Today() ), [Quantity] )
如果有预定义的当前日期成员,还能进一步简化:
Sum(YTD([Year].[Data].CurrentDateMember), [Quantity])
小提示
- 注意区分
Now()和Today():前者返回日期+时间,后者仅返回日期,根据你是否需要包含当天的时间数据来选择。 - 如果你的时间维度成员的键或名称不是标准日期格式,需要调整日期转换的逻辑,比如用
Format函数先格式化再转换。
内容的提问来源于stack exchange,提问作者arturm
相关产品推荐
相关产品推荐

