如何在Power Query中拆分年度聚合的周销售历史数据?
用Power Query拆分年度聚合周销售报告为单周销售额
核心逻辑
Ventas YTD是年初至今累计销售额,单周销售额的计算规则:
- 对应门店+SKU组合的第一周:单周销售额 = 该周的
Ventas YTD - 后续周:单周销售额 = 当前周
Ventas YTD- 上一周同门店同SKU的Ventas YTD
可视化操作步骤(Power Query界面)
导入并整理基础数据
将所有周报告导入Power Query,确保表中包含Source.Name.1(周数)、SKU、Ventas YTD、No.Tienda.number.1(门店编码)列,且Ventas YTD为数值类型。按维度排序
选中No.Tienda.number.1、SKU、Source.Name.1三列,点击「转换」选项卡的升序排序,保证同门店同SKU的周数据严格按时间顺序排列。- 如果
Source.Name.1是带文字的格式(比如"周3"),先转成数值:右键该列 → 「转换」→ 「提取」→ 「文本后的数字」,避免排序错误。
- 如果
分组计算单周销售额
- 点击「转换」→ 「分组依据」,设置分组字段为
No.Tienda.number.1和SKU,新列名设为WeeklyData,操作选「所有行」,确定后生成包含分组表的列。 - 展开
WeeklyData列,仅勾选Source.Name.1和Ventas YTD(避免重复门店、SKU列)。 - 点击「添加列」→ 「自定义列」,输入公式:
该公式自动取上一行同分组的[Ventas YTD] - List.Previous([Ventas YTD], 0)Ventas YTD做减法,第一周因无上行数据,List.Previous返回0,结果即为当前周YTD值。 - 将自定义列重命名为
Ventas semana。
- 点击「转换」→ 「分组依据」,设置分组字段为
清理并加载
删除不需要的辅助列(如WeeklyData),点击「关闭并上载」将结果导回Excel。
直接编辑M代码(高级编辑器)
若习惯写代码,替换现有查询内容为以下代码(注意替换Source部分为你的实际数据源):
let // 替换为你的实际数据源,比如Excel表或文件路径 Source = Excel.CurrentWorkbook(){[Name="你的表名"]}[Content], // 转换周数为数值(针对带文字的周数字段) #"Converted Week Number" = Table.TransformColumns(Source, {{"Source.Name.1", each Number.From(Text.AfterDelimiter(_, "周")), Int64.Type}}), // 按门店、SKU、周数升序排序 #"Sorted Rows" = Table.Sort(#"Converted Week Number",{{"No.Tienda.number.1", Order.Ascending}, {"SKU", Order.Ascending}, {"Source.Name.1", Order.Ascending}}), // 按门店和SKU分组,保留组内所有行数据 #"Grouped Rows" = Table.Group(#"Sorted Rows", {"No.Tienda.number.1", "SKU"}, {{"WeeklyData", each _, type table}}), // 展开分组内的周数据和YTD销售额 #"Expanded WeeklyData" = Table.ExpandTableColumn(#"Grouped Rows", "WeeklyData", {"Source.Name.1", "Ventas YTD"}, {"Source.Name.1", "Ventas YTD"}), // 计算单周销售额 #"Added Weekly Sales" = Table.AddColumn(#"Expanded WeeklyData", "Ventas semana", each [Ventas YTD] - List.Previous([Ventas YTD], 0)), // 清理冗余列(按需调整) #"Removed Columns" = Table.RemoveColumns(#"Added Weekly Sales",{}) in #"Removed Columns"
关键注意点
- 确保无重复的门店+SKU+周数组合,否则会导致计算错误
- 若某周缺失某门店+SKU的数据,需填充0的话,可修改自定义列公式为:
let prevYTD = try List.Previous([Ventas YTD]) otherwise 0 in [Ventas YTD] - prevYTD
内容的提问来源于stack exchange,提问作者Catalina Ustate
相关产品推荐
相关产品推荐

