强大的查询:通过乘以另一列来变换一列

Tra*_*aci 4 excel powerquery

我想做一些类似于Power Query基于Another Column转换一列的事情,但是我对如何修改特定目标的语法感到困惑。

与链接的问题类似,假定我具有下表:

Table 1:
Column A | Column B | Column C
------------------------------
 1       | 4        | 7
 2       | 5        | 8
 3       | 6        | 9
Run Code Online (Sandbox Code Playgroud)

我不想以B列为条件来更改A列的值,而是将多个列(B列和C列)中的值乘以A列中的值,并替换初始列中的值,以便获得以下内容:

Table 1:
Column A | Column B | Column C
------------------------------
 1       | 4        | 7
 2       | 10       | 16
 3       | 18       | 27
Run Code Online (Sandbox Code Playgroud)

这可以不用多个Table.AddColumn后跟序列来完成Table.RemoveColumns吗?

我也Table.TransformColumns基于此进行了尝试,但是无法正确获取语法来实现此目的。

Car*_*lsh 5

Table.TransformColumnsColumn A除非您可以索引回表,否则不会提供给您,这仅在您的列仅包含唯一数据时才可能。

Table.TransformRows 将使您能够使用所需的任何逻辑来构建新行:

let
    Source = Csv.Document("Column A,Column B,Column C
        1,4,7
        2,5,8
        3,6,9"),
    PromotedHeaders = Table.PromoteHeaders(Source),
    ChangedType = Table.TransformColumnTypes(PromotedHeaders,{{"Column A", type number}, {"Column B", type number}, {"Column C", type number}}),

    MultipliedRows = Table.FromRecords(Table.TransformRows(ChangedType, 
        each [
            Column A = [Column A],
            Column B = [Column A] * [Column B],
            Column C = [Column A] * [Column C]
        ]))
in
    MultipliedRows
Run Code Online (Sandbox Code Playgroud)

这对于B和C列效果很好,但是如果您需要B Z,则可能希望使用更合理的逻辑来避免重复。

编辑:对于许多列,更通用的解决方案是对Record.TransformFields除之外的所有列名使用转换列表"Column A"

let
    Source = Csv.Document("Column A,Column B,Column C,D,E,F
        1,4,7,1,2,3
        2,5,8,4,5,6
        3,6,9,7,8,9"),
    PromotedHeaders = Table.PromoteHeaders(Source),
    ChangedType = Table.TransformColumnTypes(PromotedHeaders,{{"Column A", type number}, {"Column B", type number}, {"Column C", type number}, {"D", type number}, {"E", type number}, {"F", type number}}),

    MultipliedRows = Table.FromRecords(Table.TransformRows(ChangedType, (row) => 
        let
            ColumnA = row[Column A],
            OtherColumns = List.RemoveItems(Record.FieldNames(row), {"Column A"}),
            Transforms = List.Transform(OtherColumns, (name) => { name, (cell) => cell * ColumnA })
        in
            Record.TransformFields(row, Transforms)))
in
    MultipliedRows
Run Code Online (Sandbox Code Playgroud)