Power Query:通过乘以另一列来转换列

时间:2015-08-07 19:13:17

标签: excel powerquery

我想做一些与Power Query Transform a Column based on Another Column类似的事情,但我仍然不知道如何修改我特定目标的语法。

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

Table 1:
Column A | Column B | Column C
------------------------------
 1       | 4        | 7
 2       | 5        | 8
 3       | 6        | 9

我希望将多列(B列和C列)中的值乘以A列中的值,而不是更改列A中的值,并替换初始列中的值,以便我可以得到以下内容:

Table 1:
Column A | Column B | Column C
------------------------------
 1       | 4        | 7
 2       | 10       | 16
 3       | 18       | 27

如果不使用Table.AddColumn后跟Table.RemoveColumns的多个序列,是否可以这样做?

我也尝试过基于thisTable.TransformColumns,但未能获得正确的语法来实现此目的。

3 个答案:

答案 0 :(得分:3)

我认为Table.AddColumn后跟Table.RemoveColumns是这种转换的通常和最清晰的方式。我也不满意这会导致PowerQuery中的这么多步骤。 但是由于PowerQuery的内部反向折叠方法,这通常不会带来更好的性能。 (PowerQuery尝试将主要工作提供给查询的数据库,如果可用的话)

答案 1 :(得分:3)

Table.TransformColumns不会给你Column 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

这适用于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

答案 2 :(得分:0)

假设这不需要是VBA和/或编程,您可以只复制第一列中的值,然后突出显示第二列中的值,并选择“Paste Special ...”>繁殖。

这将在粘贴乘数的同一位置产生结果。