You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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天滚动”的时间范围

你的理解误区总结

  1. 你误以为原公式里用了MAX(Dates[Date]),但实际上它用的是迭代中的Dates[Date],导致筛选逻辑完全失效
  2. 对ALL(Dates)的筛选范围理解有偏差:它会放开所有日期限制,如果不加<= MAX(...),会包含当前日期之后的所有数据,结果完全错误

内容的提问来源于stack exchange,提问作者Sumit Malik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:57:44