基于DAX创建滚动年度与滚动去年销售总额度量值的技术求助
解决滚动12个月销售额对比的DAX度量值问题
我明白你需要基于筛选的年份和月份,计算连续12个月的滚动销售额,以及上一年同期的滚动销售额来做对比。先帮你分析下之前代码的问题,再给出适配你场景的正确度量值。
为什么你之前的DAX代码不生效?
你之前的代码有两个关键问题:
- DATEADD的逻辑错误:
DATEADD ( Table[Date], 12, MONTH ) > MAX ( Table[Date] )是对表中每个日期加12个月后和最大日期比较,这和你需要的“向前追溯12个月”的逻辑完全不符。 - 筛选上下文处理不当:
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
相关产品推荐
相关产品推荐

