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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:30:02