关于DAX中30天滚动销售额计算度量的疑问咨询
拆解你的30天滚动销售额DAX问题
嘿,先给你理清两个核心点:原度量值本身有语法逻辑错误,以及你对筛选条件的理解有个关键偏差,咱们一步步来:
首先,原度量值的致命问题
你贴的公式里写的是:
30 Day Running Total = CALCULATE([Total Sales], FILTER (ALL (Dates), Dates[Date]>(Dates[Date]) -30 && Dates[Date] <= (Dates[Date])))
这里的Dates[Date]是FILTER迭代时当前行的日期,也就是说,这个条件其实是每个日期和自己比较:
Dates[Date] > Dates[Date]-30:任何日期肯定都比自己往前30天的日期大,这个条件永远成立Dates[Date] <= Dates[Date]:同样,任何日期都等于自己,这个条件也永远成立
所以这个FILTER等于没筛选,直接返回了整个日期表,最终计算的是所有时间的总销售额,完全不是你想要的“近30天滚动累计”——这是原公式的最大问题,你误以为它用了MAX(Dates[Date]),但实际上没有。
正确的30天滚动累计应该怎么写?
正确的写法应该把迭代时的日期和当前筛选上下文的日期做比较,也就是用MAX(Dates[Date])(或者SELECTEDVALUE(Dates[Date]),适合单日期筛选的场景):
30 Day Running Total = CALCULATE([Total Sales], FILTER (ALL (Dates), Dates[Date] > MAX(Dates[Date]) - 30 && Dates[Date] <= MAX(Dates[Date]) ) )
现在来解释你关心的第二个问题:为什么需要<= MAX(Dates[Date])?
为什么不能去掉这个<=条件?
你要明白ALL(Dates)的作用:它会移除所有对日期表的筛选,也就是说FILTER会遍历整个日期表的所有日期(从2018-01-01到2021-12-30,甚至可能更早/更晚的日期)。
假设当前筛选上下文的日期是2018-01-30,MAX(Dates[Date])就是2018-01-30,MAX(Dates[Date])-30是2017-12-31:
- 如果只写
Dates[Date] > 2017-12-31,FILTER会筛选出所有2017-12-31之后的日期——包括2018年2月、3月直到2021年12月的所有日期,这就会把之后几个月的销售额也加进来,完全不是“截至2018-01-30的近30天” - 加上
Dates[Date] <= 2018-01-30后,就把范围牢牢限定在2017-12-31到2018-01-30之间,这才是你想要的“近30天滚动”的时间范围
你的理解误区总结
- 你误以为原公式里用了
MAX(Dates[Date]),但实际上它用的是迭代中的Dates[Date],导致筛选逻辑完全失效 - 对
ALL(Dates)的筛选范围理解有偏差:它会放开所有日期限制,如果不加<= MAX(...),会包含当前日期之后的所有数据,结果完全错误
内容的提问来源于stack exchange,提问作者Sumit Malik
相关产品推荐
相关产品推荐

