基于年度重置的累计值列计算当月值
问题:按组计算月度差值(累计值减上月累计值)
现有数据与需求
现有表格包含三列:group(分组)、Period(年月格式)、RunningValue(累计值),每年1月的累计值会重置为当月实际值。
需要新增MonthlyValue列,计算逻辑:
- 1月直接取
RunningValue(因年初重置) - 其他月份按
group分组,用当月RunningValue减去同组上月的RunningValue
尝试过的DAX代码
代码1(语法不完整)
MonthlyValue = CALCULATE(Table[RunningValue], PREVIOUSMONTH(Table[Period])
代码2(未生效)
MonthlyValue = VAR Cumulative=Table[RunningValue] VAR PreviousCumulative= CALCULATE( [RunningValue], DATEADD(Table[Period], -1, MONTH) ) RETURN Cumulative-PreviousCumulative
以上代码仅1月结果正确,其余月份得到的结果与RunningValue一致,无法算出正确差值。
解决方案
问题出在未保留group的上下文,导致DATEADD/PREVIOUSMONTH没有筛选同组的上月数据。以下两种DAX表达式可解决:
方案1:明确筛选同组上月数据
MonthlyValue = VAR CurrentGroup = Table[group] VAR CurrentPeriod = Table[Period] VAR PreviousPeriod = EDATE(CurrentPeriod, -1) VAR PreviousCumulative = CALCULATE( MAX(Table[RunningValue]), Table[group] = CurrentGroup, Table[Period] = PreviousPeriod ) RETURN IF( MONTH(CurrentPeriod) = 1, Table[RunningValue], Table[RunningValue] - PreviousCumulative )
方案2:用ALLEXCEPT保留分组上下文
MonthlyValue = VAR PreviousCumulative = CALCULATE( Table[RunningValue], PREVIOUSMONTH(Table[Period]), ALLEXCEPT(Table, Table[group]) ) RETURN IF( MONTH(Table[Period]) = 1, Table[RunningValue], Table[RunningValue] - PreviousCumulative )
说明
- 方案1通过变量存储当前分组和日期,直接筛选同组上月的累计值,逻辑清晰不易出错
- 方案2用
ALLEXCEPT清除除group外的所有上下文,确保PREVIOUSMONTH只返回同组的上月数据 - 两个方案都会自动处理1月的特殊情况,直接返回累计值
内容的提问来源于stack exchange,提问作者alo
相关产品推荐
相关产品推荐

