如何在Power Query中自动聚合所有数值类型列?
解决Power Query自动聚合数值列时的类型判断错误
错误原因
原代码中Value.Type(#"Removed Columns"{0}[_])的写法存在语法问题:_代表的是列名字符串,Power Query无法通过[_]这种字段访问语法直接处理文本类型的列名,因此触发了"无法对文本类型应用字段访问"的错误。另外,依赖行数据判断类型还可能存在隐患(比如第一行是空值时,Value.Type会返回type any导致误判)。
修正方案
直接利用Table.Schema返回的列元数据来筛选数值类型列,这种方式更可靠且语法正确:
// 步骤1:从表结构中筛选所有数值类型列 TransformRules = Table.SelectRows(Table.Schema(#"Removed Columns"), each List.Contains({"Int64.Type", "Double.Type", "Decimal.Type"}, [TypeName]) ) |> Table.ToRecords |> List.Transform(_, each {[Name], each List.Sum(_), type nullable number}), // 步骤2:按JobNumber分组并应用聚合规则 #"GroupedRows" = Table.Group( #"Removed Columns", {"JobNumber"}, TransformRules )
代码说明
- 筛选数值列:通过
Table.Schema获取表的结构信息,筛选出类型为整数、双精度浮点数、十进制数的列,覆盖所有常见数值类型。 - 生成聚合规则:将筛选后的列信息转换为记录,再映射成
Table.Group需要的{列名, 聚合函数, 返回类型}格式。 - 分组聚合:传入分组键和自动生成的规则,完成批量聚合,后续新增数值列无需手动修改代码。
替代修正(兼容原逻辑)
如果坚持依赖行数据判断类型,可将原代码中的字段访问改为Record.Field:
// Step 1: 识别数值列 DecimalColumns = List.Select( Table.Schema(#"Removed Columns")[Name], each Value.Type(Record.Field(#"Removed Columns"{0}, _)) = type number ), // Step 2: 生成聚合规则 TransformRules = List.Transform(DecimalColumns, each {_, each List.Sum(_), type nullable number}), // Step 3: 分组聚合 #"GroupedRows" = Table.Group( #"Removed Columns", {"JobNumber"}, TransformRules )
这种方式修复了语法错误,但仍存在依赖行数据的隐患,优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者Stephanie Noyce




