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

Power BI需求:计算并对比近4/12/26周及去年同期销售额

基于ISO周数的销售额周期对比解决方案

我来帮你搞定这个基于ISO周数的销售额对比问题!针对你需要计算近4/12/26周销售额,以及对应去年同期周期的需求,我会用Power BI的DAX公式来实现,完全匹配ISO周的规则。

第一步:添加ISO年和ISO周计算列

首先,我们需要给数据表添加两个计算列,用来确定每个周末日期对应的ISO年份和ISO周数——这是解决同日期跨年度ISO周不一致问题的核心:

ISO 年份 = YEAR(DATEADD('你的表名'[周末日期], 2 - WEEKDAY('你的表名'[周末日期], 2), DAY))
ISO 周数 = WEEKNUM('你的表名'[周末日期], 21)
  • WEEKNUM的参数21是ISO周的标准计算方式,确保周数符合国际标准。
  • ISO 年份的计算是为了处理跨年周的情况(比如1月1日可能属于上一年的最后一个ISO周),通过把日期调整到当周周一后再取年份,保证年份和ISO周匹配。

第二步:计算当前周期的销售额

接下来创建度量值,计算近4周、12周、26周的销售额:

近4周销售额

近4周销售额 = 
VAR 当前ISO年 = SELECTEDVALUE('你的表名'[ISO 年份])
VAR 当前ISO周 = SELECTEDVALUE('你的表名'[ISO 周数])
RETURN
CALCULATE(
    SUM('你的表名'[销售额]),
    FILTER(
        ALL('你的表名'),
        '你的表名'[ISO 年份] = 当前ISO年 &&
        '你的表名'[ISO 周数] >= 当前ISO周 - 3 && // 包含当前周在内的4周,所以减3
        '你的表名'[ISO 周数] <= 当前ISO周
    )
)

近12周销售额

把周数差值改成-11即可:

近12周销售额 = 
VAR 当前ISO年 = SELECTEDVALUE('你的表名'[ISO 年份])
VAR 当前ISO周 = SELECTEDVALUE('你的表名'[ISO 周数])
RETURN
CALCULATE(
    SUM('你的表名'[销售额]),
    FILTER(
        ALL('你的表名'),
        '你的表名'[ISO 年份] = 当前ISO年 &&
        '你的表名'[ISO 周数] >= 当前ISO周 - 11 &&
        '你的表名'[ISO 周数] <= 当前ISO周
    )
)

近26周销售额

周数差值改成-25:

近26周销售额 = 
VAR 当前ISO年 = SELECTEDVALUE('你的表名'[ISO 年份])
VAR 当前ISO周 = SELECTEDVALUE('你的表名'[ISO 周数])
RETURN
CALCULATE(
    SUM('你的表名'[销售额]),
    FILTER(
        ALL('你的表名'),
        '你的表名'[ISO 年份] = 当前ISO年 &&
        '你的表名'[ISO 周数] >= 当前ISO周 - 25 &&
        '你的表名'[ISO 周数] <= 当前ISO周
    )
)

第三步:计算去年同期对应周期的销售额

和当前周期逻辑一致,只是把ISO年份改为当前ISO年 - 1,确保匹配去年的同一ISO周周期:

去年同期近4周销售额

去年同期近4周销售额 = 
VAR 当前ISO年 = SELECTEDVALUE('你的表名'[ISO 年份])
VAR 当前ISO周 = SELECTEDVALUE('你的表名'[ISO 周数])
RETURN
CALCULATE(
    SUM('你的表名'[销售额]),
    FILTER(
        ALL('你的表名'),
        '你的表名'[ISO 年份] = 当前ISO年 - 1 &&
        '你的表名'[ISO 周数] >= 当前ISO周 - 3 &&
        '你的表名'[ISO 周数] <= 当前ISO周
    )
)

去年同期近12周销售额

去年同期近12周销售额 = 
VAR 当前ISO年 = SELECTEDVALUE('你的表名'[ISO 年份])
VAR 当前ISO周 = SELECTEDVALUE('你的表名'[ISO 周数])
RETURN
CALCULATE(
    SUM('你的表名'[销售额]),
    FILTER(
        ALL('你的表名'),
        '你的表名'[ISO 年份] = 当前ISO年 - 1 &&
        '你的表名'[ISO 周数] >= 当前ISO周 - 11 &&
        '你的表名'[ISO 周数] <= 当前ISO周
    )
)

去年同期近26周销售额

去年同期近26周销售额 = 
VAR 当前ISO年 = SELECTEDVALUE('你的表名'[ISO 年份])
VAR 当前ISO周 = SELECTEDVALUE('你的表名'[ISO 周数])
RETURN
CALCULATE(
    SUM('你的表名'[销售额]),
    FILTER(
        ALL('你的表名'),
        '你的表名'[ISO 年份] = 当前ISO年 - 1 &&
        '你的表名'[ISO 周数] >= 当前ISO周 - 25 &&
        '你的表名'[ISO 周数] <= 当前ISO周
    )
)

验证你的示例

以你提到的2018年2月25日周末为例:

  1. 先计算它的ISO年和周数:2018年2月25日是周日,对应ISO 2018年第8周。
  2. 近4周就是2018年第5-8周,销售额总和为275,和你的预期一致。
  3. 去年同期就是2017年第5-8周,销售额总和为280,完全匹配你的需求。

额外提示

  • 如果你的数据里有独立的日期表,建议把ISO年和周数添加到日期表中,再与销售表关联,这样计算会更高效稳定。
  • 测试时先检查ISO 年份和ISO 周数列的数值是否正确,确保每一行的周数和年份对应准确后,再验证销售额度量值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:39:15