Power Query:如何更新 table 中的列值?
Power Query: How to update column values in a table?
需要您帮助解决以下问题:
我有一个以 Excel table 作为来源的查询。
此 table 有多个 user-input 列,现在需要将其乘以此 table 中另一列的系数。应保留列名。
示例:
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)
或者通过对列列表应用逻辑更好。
当然,我可以通过一个接一个地创建新列来做到这一点,但我发现这既不优雅也不高效。
任何人都可以给我一些建议吗?谢谢!
我找到了问题的解决方案。
用Table.TransformRows
函数完成。
显而易见的解决方案是使用 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 and his
备选方案
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}
...
为了不计算两次
需要您帮助解决以下问题:
我有一个以 Excel table 作为来源的查询。 此 table 有多个 user-input 列,现在需要将其乘以此 table 中另一列的系数。应保留列名。
示例:
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)
或者通过对列列表应用逻辑更好。
当然,我可以通过一个接一个地创建新列来做到这一点,但我发现这既不优雅也不高效。
任何人都可以给我一些建议吗?谢谢!
我找到了问题的解决方案。
用Table.TransformRows
函数完成。
显而易见的解决方案是使用 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 and his
备选方案
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}
...
为了不计算两次