需要您的帮助以解决以下问题:
我有一个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)
或者甚至更好地为列表列表应用逻辑。
当然,我可以通过逐个创建新列来实现,但我发现这既不优雅也没有效率。
有人可以给我一个建议吗?谢谢!
答案 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