Power Query按条件分组聚合+动态列实现方案咨询
按聚合条件列动态聚合周度数值的M代码方案
数据结构说明
假设你的表格列名对应如下(可根据实际情况调整):
- 国家:
Country(原A列) - 产品分类:
Product_Category(原E列) - 产品名称:
Product_Name(原F列) - 聚合条件:
AGG_Condition(原G列) - 动态周度列: 列名包含
Week_(原H-L列,对应周44-48)
核心M代码(以求和聚合为例)
let // 加载原始数据,替换成你的数据源引用(比如Excel表名/CSV路径) Source = Excel.CurrentWorkbook(){[Name="YourRawDataTable"]}[Content], // 自动识别所有周度列(适配动态周数,无需硬编码) WeekColumns = List.Select(Table.ColumnNames(Source), each Text.Contains(_, "Week_")), // 按维度列+聚合条件分组,对每个周度列执行求和聚合 AggregatedData = Table.Group(Source, {"Country", "Product_Category", "Product_Name", "AGG_Condition"}, List.Transform(WeekColumns, each {_, each List.Sum(_), type number})), // 移除聚合列的自动后缀(.1),恢复原始周度列名 CleanColumnNames = Table.RenameColumns(AggregatedData, List.Zip({List.Select(Table.ColumnNames(AggregatedData), each Text.EndsWith(_, ".1")), WeekColumns})), // 最终输出结果 FinalResult = CleanColumnNames in FinalResult
聚合逻辑说明
- 动态周列识别:通过
List.Select匹配所有含Week_的列,不管周数怎么变化(比如新增周49、删除周44)都能自动适配,避免硬编码列名的维护问题。 - 分组聚合:以维度列(国家、产品信息)和
AGG_Condition为分组键,对每个周度列执行List.Sum求和。如果需要其他聚合方式,直接替换List.Sum即可:- 平均值:
List.Average - 计数:
List.Count - 最大值:
List.Max
- 平均值:
- 列名清理:分组后的聚合列会自动添加
.1后缀,通过Table.RenameColumns将其恢复为原始周度列名,保证输出格式的一致性。
扩展:按聚合条件值切换聚合方式
如果AGG_Condition列的不同值对应不同聚合规则(比如"Sum"对应求和,"Avg"对应平均),可以修改分组逻辑:
AggregatedData = Table.Group(Source, {"Country", "Product_Category", "Product_Name", "AGG_Condition"}, List.Transform(WeekColumns, each {_, each if [AGG_Condition]{0} = "Sum" then List.Sum(_) else if [AGG_Condition]{0} = "Avg" then List.Average(_) else if [AGG_Condition]{0} = "Count" then List.Count(_) else null, type number}))
内容的提问来源于stack exchange,提问作者Artemy Panin
相关产品推荐
相关产品推荐

