Power BI DAX 计算非YTD度量值跨上年周数的同比变化率
DAX 周度同比总计修正方案
实现思路
- 优先判断当前计算上下文是否为年度总计行,以及当前年度是否为数据集中最新的未完成自然年
- 提取最新年度有销售额记录的最大周数n
- 仅当计算最新未完成年的年度总计同比时,截断上年的统计范围为前n周,其余所有场景保留原有单周对比/全年对比逻辑
具体度量值实现
1. 辅助度量值(获取最新有数据年度的最大周数)
Max_Week_In_Latest_Year = VAR LatestYear = CALCULATE(MAX(Dates2[Year]), ALL(FactSales)) VAR LatestWeek = CALCULATE(MAX(Dates2[WeekNumber]), ALL(FactSales), Dates2[Year] = LatestYear) RETURN LatestWeek
2. 修正后的上年同期销售额度量值
SalesAmount_SWLY_Adjusted = VAR CurrentYear = SELECTEDVALUE(Dates2[Year]) VAR CurrentWeek = SELECTEDVALUE(Dates2[WeekNumber]) VAR LatestDataYear = CALCULATE(MAX(Dates2[Year]), ALL(FactSales)) VAR LatestDataWeek = [Max_Week_In_Latest_Year] // 判断当前上下文是否为年度总计(周维度未被筛选) VAR IsYearTotal = ISBLANK(CurrentWeek) // 判断是否属于最新未完成年对比上年的特殊场景 VAR NeedTruncate = IsYearTotal && CurrentYear = LatestDataYear && LatestDataWeek < 53 RETURN IF( NeedTruncate, // 特殊场景:截断上年统计范围为前n周 CALCULATE( [SalesAmount], ALL(Dates2), Dates2[Year] = CurrentYear - 1, Dates2[WeekNumber] <= LatestDataWeek ), // 其余场景:沿用原有同周匹配逻辑 CALCULATE( [SalesAmount], FILTER( ALL(Dates2), Dates2[Year] = CurrentYear - 1 && Dates2[WeekNumber] = CurrentWeek ) ) )
3. 最终周度同比变化率度量值
Weekly_YoY_Rate = VAR CurrentSales = [SalesAmount] VAR PreviousSales = [SalesAmount_SWLY_Adjusted] RETURN IF( NOT(ISBLANK(PreviousSales)) && PreviousSales <> 0, DIVIDE(CurrentSales - PreviousSales, PreviousSales), BLANK() )
逻辑适配说明
- 单周行上下文:自动沿用原有同周对比逻辑,无需额外调整
- 已完结年度总计行:对应年度周数满53时,直接对比上年全年销售额,符合通用规则
- 最新未完结年度总计行:自动截断上年统计范围为前n周,你提到的2021年2周场景会自动取2020年前2周合计16计算,得到-18.75%的正确结果
- 历史年度缺周场景:比如2017年仅存前50周数据的场景,不属于最新未完结年度对比范畴,直接用2017年全部已存周总和对比2016年全年总和,兼容要求已覆盖
内容的提问来源于stack exchange,提问作者user3812887
相关产品推荐
相关产品推荐

