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

基于DAX创建滚动年度与滚动去年销售总额度量值的技术求助

解决滚动12个月销售额对比的DAX度量值问题

我明白你需要基于筛选的年份和月份,计算连续12个月的滚动销售额,以及上一年同期的滚动销售额来做对比。先帮你分析下之前代码的问题,再给出适配你场景的正确度量值。

为什么你之前的DAX代码不生效?

你之前的代码有两个关键问题:

  1. DATEADD的逻辑错误:DATEADD ( Table[Date], 12, MONTH ) > MAX ( Table[Date] ) 是对表中每个日期加12个月后和最大日期比较,这和你需要的“向前追溯12个月”的逻辑完全不符。
  2. 筛选上下文处理不当:ALL (Table[Date]) 会移除所有日期相关的筛选,包括你需要保留的类别、制造商等维度筛选,导致计算结果范围不对。

正确的度量值实现

1. Rolling Year(滚动12个月销售额)

这个度量值会以你筛选的月份为终点,计算往前11个月(总共12个月)的销售额总和,同时保留类别、制造商等维度的筛选:

Rolling Year = 
VAR SelectedEndDate = MAX ( 'Table'[Sales Date] )
-- 计算滚动区间的起始日期:结束日期往前推11个月,得到连续12个月的范围
VAR RollingStartDate = EDATE ( SelectedEndDate, -11 )
RETURN
CALCULATE (
    SUM ( 'Table'[Sales Volume] ),
    -- 移除年份和月份筛选,让我们能扩展到之前的年份
    ALL ( 'Table'[Year], 'Table'[Month Number], 'Table'[Month] ),
    -- 限定日期在滚动区间内
    'Table'[Sales Date] >= RollingStartDate,
    'Table'[Sales Date] <= SelectedEndDate,
    -- 保留类别、制造商的筛选上下文
    VALUES ( 'Table'[Category] ),
    VALUES ( 'Table'[Maker] )
)

2. Rolling Last Year(上一年同期滚动销售额)

这个度量值会计算和当前滚动区间对应的上一年同期12个月的销售额,比如当前是2020年2月-2021年1月,就计算2019年2月-2020年1月的总和:

Rolling Last Year = 
VAR SelectedEndDate = MAX ( 'Table'[Sales Date] )
-- 当前滚动区间的起始日期
VAR CurrentRollingStart = EDATE ( SelectedEndDate, -11 )
-- 上一年同期滚动区间的起始和结束日期:整体往前推12个月
VAR LastYearRollingStart = EDATE ( CurrentRollingStart, -12 )
VAR LastYearRollingEnd = EDATE ( SelectedEndDate, -12 )
RETURN
CALCULATE (
    SUM ( 'Table'[Sales Volume] ),
    ALL ( 'Table'[Year], 'Table'[Month Number], 'Table'[Month] ),
    'Table'[Sales Date] >= LastYearRollingStart,
    'Table'[Sales Date] <= LastYearRollingEnd,
    VALUES ( 'Table'[Category] ),
    VALUES ( 'Table'[Maker] )
)

优化建议(如果有日期表的话)

如果你在模型中使用了单独的日期表(推荐做法,能更好处理日期上下文),可以简化代码,同时避免月末、闰年等特殊日期的问题:

假设你的日期表叫'Date',包含Date、Year、Month Number等字段,那么度量值可以写成:

Rolling Year (日期表版) = 
VAR SelectedEndDate = MAX ( 'Date'[Date] )
VAR RollingStartDate = EDATE ( SelectedEndDate, -11 )
RETURN
CALCULATE (
    SUM ( 'Table'[Sales Volume] ),
    -- 直接用DATESBETWEEN限定日期区间,自动处理筛选上下文
    DATESBETWEEN ( 'Date'[Date], RollingStartDate, SelectedEndDate ),
    VALUES ( 'Table'[Category] ),
    VALUES ( 'Table'[Maker] )
)
Rolling Last Year (日期表版) = 
VAR SelectedEndDate = MAX ( 'Date'[Date] )
VAR RollingStartDate = EDATE ( SelectedEndDate, -11 )
RETURN
CALCULATE (
    SUM ( 'Table'[Sales Volume] ),
    -- 用DATEADD把整个日期区间往前推12个月
    DATEADD ( DATESBETWEEN ( 'Date'[Date], RollingStartDate, SelectedEndDate ), -12, MONTH ),
    VALUES ( 'Table'[Category] ),
    VALUES ( 'Table'[Maker] )
)

使用日期表的版本更简洁可靠,建议优先采用这种方式。

内容的提问来源于stack exchange,提问作者Ricardo J. Martínez Suástegui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:02:32