Power Query:如何更新表中的列值?

时间:2016-07-07 13:28:23

标签: powerquery

需要您的帮助以解决以下问题:

我有一个Excel表作为源的查询。 此表有几个用户输入列,现在需要乘以此表中另一列的系数。应保留列名。

示例:

let
    Source = Table.FromColumns({{1, 1}, {2, 2}, {null, 0.5}}, {"Clmn1", "Clmn2", "ClmnMultiplier"})
in
    Source

有没有办法更新这样的值:

row[Clmn1] = row[Clmn1] * IsNull(Row[ClmnMultiplier],1)
row[Clmn2] = row[Clmn2] * IsNull(Row[ClmnMultiplier],1)

或者甚至更好地为列表列表应用逻辑。

当然,我可以通过逐个创建新列来实现,但我发现这既不优雅也没有效率。

有人可以给我一个建议吗?谢谢!

2 个答案:

答案 0 :(得分:2)

替代解决方案

let
    colNames = {"Clmn1", "Clmn2", "ClmnMultiplier"},
    Source = Table.FromColumns({{1, 1}, {2, 2}, {null, 0.5}}, colNames),
    transformRows = Table.TransformRows(Source, each Record.TransformFields(_, {
        {"Clmn1", (f)=>[Clmn1]*(if [ClmnMultiplier] is null then 1 else [ClmnMultiplier])},
        {"Clmn2", (f)=>[Clmn2]*(if [ClmnMultiplier] is null then 1 else [ClmnMultiplier])}
    }))
in
    Table.FromList(transformRows, Record.ToList, colNames)

顺便说一下,你可以预先计算 null_1=(if [ClmnMultiplier] is null then 1 else [ClmnMultiplier])
在函数之外(在每一行中)并像这样使用它:

...
{"Clmn1", (f)=>[Clmn1]*null_1},
{"Clmn2", (f)=>[Clmn2]*null_1}
...

为了不计算两次

答案 1 :(得分:1)

我找到了问题的解决方案。

使用Table.TransfolmRows函数完成。 显而易见的解决方案是使用Table.TransformColumns,但事实证明我无法从中引用当前行。一些搜索指出了这个解决方案:

let
    Source = Table.FromColumns({{1, 1}, {2, 2}, {null, 0.5}}, {"Clmn1", "Clmn2", "ClmnMultiplier"}),
    Transf = Table.FromRecords(
                Table.TransformRows(Source, 
                    (r) => Record.TransformFields(r,
                            {
                                {"Clmn1", each if r[ClmnMultiplier] <> null then _ * r[ClmnMultiplier] else _}, 
                                {"Clmn2", each if r[ClmnMultiplier] <> null then _ * r[ClmnMultiplier] else _}
                            })
                )
            )
in
    Transf

非常感谢LoganTheSnowEater和他的post