如何创建计算过去21天平均支出的度量值?现有公式返回无效值
问题排查与修正方案
原公式的核心问题
- 误用事实表日期层级:
'Raw_Data'[Date_1].[Day]是日期字段的层级引用,而非完整日期列,会导致DATESBETWEEN无法生成连续的日期范围,尤其当事实表存在日期缺失时,窗口范围会直接断裂。 - LASTDATE的上下文缺陷:直接基于事实表日期列取
LASTDATE,如果事实表中没有最新日期的记录,会返回空值,导致后续计算全失效。 - 冗余的CALCULATE嵌套:AVERAGEX内部的
CALCULATE(AVERAGE('Raw_Data'[Spend]))属于多余操作,AVERAGEX本身会逐行迭代日期范围,CALCULATE触发的上下文转换会干扰计算逻辑,最终导致返回0或空值。 - 无专用日期表支撑:滚动平均需要连续的日期序列,仅依赖事实表的日期列会因日期缺失导致窗口不完整,无法准确覆盖21天周期。
修正后的DAX公式
前提:创建专用日期表
先建立一个包含连续日期的专用日期表(命名为DateTable),并与Raw_Data的Date_1列建立关联(一对一或一对多均可)。
基础版滚动平均(包含无支出的日期)
21天滚动平均支出 = VAR __当前最大日期 = MAX('DateTable'[Date]) VAR __滚动窗口 = DATESBETWEEN( 'DateTable'[Date], __当前最大日期 - 21, __当前最大日期 ) RETURN AVERAGEX( __滚动窗口, CALCULATE(SUM('Raw_Data'[Spend])) )
进阶版(仅计算有支出记录的日期)
如果需要忽略无支出的日期,只计算有数据的日期平均值,可使用以下公式:
21天滚动平均支出(仅含有效日期) = VAR __当前最大日期 = MAX('DateTable'[Date]) VAR __滚动窗口 = DATESBETWEEN( 'DateTable'[Date], __当前最大日期 - 21, __当前最大日期 ) VAR __每日支出明细 = ADDCOLUMNS( __滚动窗口, "@单日支出", CALCULATE(SUM('Raw_Data'[Spend])) ) RETURN AVERAGEX( FILTER(__每日支出明细, [@单日支出] <> BLANK()), [@单日支出] )
关键调整说明
- 专用日期表保障连续性:确保21天窗口是完整的连续日期,即使某天无支出数据也会纳入计算(基础版中无支出日期按0处理,进阶版则直接过滤)。
- 简化日期范围计算:用
__当前最大日期 - 21替代DATEADD,避免层级引用带来的异常,逻辑更直观。 - 替换AVERAGE为SUM:迭代中先计算单日总支出,再取21天的平均,避免原公式中单日多记录时的平均偏差问题。
内容的提问来源于stack exchange,提问作者hockeybum
相关产品推荐
相关产品推荐

