PowerBI中DAX滚动3个月平均度量值计算错误求助
问题分析与DAX修正
你的DAX公式核心问题在于ID总数的计算逻辑不符合预期:
- 原公式用
DISTINCTCOUNT('Table'[ID])计算的是滚动3个月内不重复的唯一ID总数,但你的需求是把这三个月的每月独立统计的ID数直接相加(即使同一ID出现在多个月份,每个月都算一次)。
修正后的DAX公式
方案1(推荐使用独立日期表)
如果你的模型中有标准日期表(推荐建模方式),可以用以下度量值:
Trailing 3 Month Action % = VAR CurrentMonthEnd = EOMONTH(MAX('Date'[Date]), 0) VAR RollingStart = EOMONTH(CurrentMonthEnd, -3) + 1 -- 筛选最近3个完整自然月 VAR RollingPeriod = DATESBETWEEN('Date'[Date], RollingStart, CurrentMonthEnd) -- 计算滚动3个月的行动总数 VAR TotalRollingActions = CALCULATE(SUM('Table'[Action_ind]), RollingPeriod) -- 计算滚动3个月的ID数总和(每个月的ID数相加) VAR TotalRollingIDs = CALCULATE( SUMX(VALUES('Date'[Month]), DISTINCTCOUNT('Table'[ID])), RollingPeriod ) RETURN DIVIDE(TotalRollingActions, TotalRollingIDs, 0)
方案2(无独立日期表)
如果没有单独的日期表,直接基于原表的日期字段调整:
Trailing 3 Month Action % = VAR CurrentMonthEnd = EOMONTH(MAX('Table'[Date]), 0) VAR ThreeMonthsPriorEnd = EOMONTH(CurrentMonthEnd, -3) -- 筛选最近3个完整自然月的日期范围 VAR RollingFilter = 'Table'[Date] > ThreeMonthsPriorEnd && 'Table'[Date] <= CurrentMonthEnd VAR TotalRollingActions = CALCULATE(SUM('Table'[Action_ind]), RollingFilter) -- 按月份分组,计算每个月的ID数后求和 VAR TotalRollingIDs = SUMX( VALUES(FORMAT('Table'[Date], "YYYYMM")), -- 按年月唯一值分组 CALCULATE(DISTINCTCOUNT('Table'[ID]), RollingFilter) ) RETURN DIVIDE(TotalRollingActions, TotalRollingIDs, 0)
关键修正点说明
- 用
EOMONTH锁定自然月区间:确保筛选的是完整的三个月,避免因当月日期未到月底导致的区间偏差。 - 用
SUMX迭代计算每月ID数总和:通过按年月分组,对每个月单独计算DISTINCTCOUNT('Table'[ID])后再求和,完全匹配你手动计算的逻辑(三月=(195+147+182)/(350+240+321))。 - 替换原
DISTINCTCOUNT的全局统计:原公式的全局DISTINCTCOUNT会剔除跨月重复的ID,导致分母偏小、结果偏高,修正后分母为各月ID数的累加值,与预期一致。
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

