如何在DAX中实现以每年6月1日为起点的滚动平均值?
解决以每年6月1日为起点的滚动平均值计算问题
问题背景
我有如下事实表:
在.pbix文件中已设置Year-Month过滤器,需要计算以每年6月1日为起点的滚动平均值,预期效果如下:
- 选中6月时,结果为1(计算方式:1/1)
- 选中7月时,结果为1(计算方式:2/2)
- 选中8月时,结果为0.66(计算方式:2/3)
- 选中9月时,结果为0.5(计算方式:2/4)
以此类推。
当前使用的度量值未达到预期:
Users := CALCULATE(SUM(Users[Actual]), FILTER('Type', 'Type'[C Or A] IN {"C"} )) Measure1 := AVERAGEX(VALUES('Date'[K_Date]), [Users]) Measure2 := CALCULATE([Measure1] ,DATESYTD('Date'[Date],"31/05"))
问题分析
现有度量值的核心问题是:DATESYTD虽指定了财年结束日,但AVERAGEX仅对当前筛选的日期值取平均,没有实现从6月1日到选中月份的累积滚动计算——即分子应为6月至当前月的Users总和,分母为这段时间的月份数。
修正后的度量值
直接构建符合需求的滚动平均度量值,无需拆分多个中间度量:
滚动平均值(6月起)= VAR CurrentMonth = MAX('Date'[Date]) VAR FYStartDate = DATE(YEAR(CurrentMonth), 6, 1) VAR SelectedPeriod = DATESBETWEEN('Date'[Date], FYStartDate, CurrentMonth) VAR TotalUsers = CALCULATE(SUM(Users[Actual]), FILTER('Type', 'Type'[C Or A] = "C"), SelectedPeriod) VAR MonthCount = COUNTROWS(DISTINCT('Date'[Year-Month])) RETURN DIVIDE(TotalUsers, MonthCount, 0)
关键说明:
FYStartDate:根据选中月份自动定位当年6月1日作为财年起始点SelectedPeriod:筛选出从6月1日到当前选中月份的完整日期范围TotalUsers:计算该范围内符合C类型条件的Actual总和MonthCount:统计范围内的月份数量(若日期表无现成Year-Month列,可替换为DATEDIFF(FYStartDate, CurrentMonth, MONTH) + 1)DIVIDE函数处理除数为0的异常情况,返回0避免报错
若你的日期表中K_Date代表每月固定日期(如每月1号),也可将MonthCount调整为COUNTROWS(VALUES('Date'[K_Date]), SelectedPeriod)来确保统计准确。
逻辑验证
对应预期场景:
- 选中6月:TotalUsers=1,MonthCount=1 → 1/1=1
- 选中7月:TotalUsers=1+1=2,MonthCount=2 → 2/2=1
- 选中8月:TotalUsers=1+1+0=2,MonthCount=3 → 2/3≈0.66
- 选中9月:TotalUsers=1+1+0+0=2,MonthCount=4 → 2/4=0.5
完全匹配预期结果。
内容的提问来源于stack exchange,提问作者Chicago1988
相关产品推荐
相关产品推荐

