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日周末为例:
- 先计算它的ISO年和周数:2018年2月25日是周日,对应ISO 2018年第8周。
- 近4周就是2018年第5-8周,销售额总和为275,和你的预期一致。
- 去年同期就是2017年第5-8周,销售额总和为280,完全匹配你的需求。
额外提示
- 如果你的数据里有独立的日期表,建议把ISO年和周数添加到日期表中,再与销售表关联,这样计算会更高效稳定。
- 测试时先检查
ISO 年份和ISO 周数列的数值是否正确,确保每一行的周数和年份对应准确后,再验证销售额度量值。
内容的提问来源于stack exchange,提问作者user1220540
相关产品推荐
相关产品推荐

