You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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
)

代码说明

  1. 筛选数值列:通过Table.Schema获取表的结构信息,筛选出类型为整数、双精度浮点数、十进制数的列,覆盖所有常见数值类型。
  2. 生成聚合规则:将筛选后的列信息转换为记录,再映射成Table.Group需要的{列名, 聚合函数, 返回类型}格式。
  3. 分组聚合:传入分组键和自动生成的规则,完成批量聚合,后续新增数值列无需手动修改代码。

替代修正(兼容原逻辑)

如果坚持依赖行数据判断类型,可将原代码中的字段访问改为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

火山引擎 最新活动