如何在Power BI中编写DAX公式实现按周的WTD(周累计)同比对比?
Power BI 周累计(WTD)与去年同期差值度量值构建指南
前提准备
必须拥有标记为日期表的规范日期维度表,包含至少以下字段(可通过DAX生成):
日期:完整日期列ISO年份:基于ISO周规则的年份(避免跨年周歧义)ISO周数:ISO标准周数(周一为周起始)周内天数:周内日期排序(1=周一,7=周日)
可选DAX字段生成(用于ISO周规范)
ISO年份 = YEAR('日期表'[日期] - WEEKDAY('日期表'[日期], 2) + 4) ISO周数 = WEEKNUM('日期表'[日期], 21) -- 21对应ISO周规则 周内天数 = WEEKDAY('日期表'[日期], 2) -- 1=周一,7=周日
核心度量值构建
1. 当期周累计(WTD)
使用TOTALWTD简化计算,自动匹配当前上下文的周范围:
当期WTD = TOTALWTD(SUM('业务数据表'[度量值列]), '日期表'[日期])
替换
'业务数据表'[度量值列]为你的实际数值列(如销售额、订单量),若需自定义周起始(如周一),修改为:当期WTD = TOTALWTD(SUM('业务数据表'[度量值列]), '日期表'[日期], 2) -- 2代表周一为周起始
2. 去年同期周累计(WTD)
方案1:基于自然周(SAMEPERIODLASTYEAR)
适合周定义与日历自然周完全匹配的场景:
去年同期WTD = CALCULATE([当期WTD], SAMEPERIODLASTYEAR('日期表'[日期]))
方案2:基于ISO周(无跨年歧义)
解决跨年周(如12月最后一周属于下一年ISO周)的匹配问题:
去年同期WTD(ISO周) = VAR 当前ISO年 = MAX('日期表'[ISO年份]) VAR 当前ISO周 = MAX('日期表'[ISO周数]) VAR 当前周内天 = MAX('日期表'[周内天数]) RETURN CALCULATE( SUM('业务数据表'[度量值列]), '日期表'[ISO年份] = 当前ISO年 - 1, '日期表'[ISO周数] = 当前ISO周, '日期表'[周内天数] <= 当前周内天 )
3. WTD同比差值
直接计算当期与去年同期的差值:
WTD同比差值 = [当期WTD] - [去年同期WTD]
关键注意事项
- 务必将日期表标记为日期表:右键日期表 → 标记为日期表,确保时间智能函数正常生效。
- 周起始规则统一:所有涉及周的计算需使用相同的起始日(如全用周一或全用周日),避免上下文冲突。
- 上下文过滤:在报表中使用日期表的日期/周字段进行切片或筛选,不要直接使用业务表的日期列。
内容的提问来源于stack exchange,提问作者h04phg
相关产品推荐
相关产品推荐

