在PowerQuery中,我們經(jīng)常需要動態(tài)改變一列的值。我知道的有兩種情形:
1.在不涉及表格中的其他列的情況下改變列值;
2.基于表格的其他列的值,動態(tài)改變列值。
而常見的方法也有兩種:
1.通過新增列來實現(xiàn)改變列值,這是最直觀的方法。很容易通過UI就完成任務(wù)了。缺點是新增了列,可能還需要刪除不需要的列。
2.通過列變換來實現(xiàn)改變列值,而不需要新增列。
由于通過新增列改變列值的方法最簡單最直觀,因此不作演示。
本文主要羅列幾種不需要新增列就能改變列值的方法。這些方法都不是我原創(chuàng),不過可能加入了一點我自己的思考。
示例表格如下:

要求將性別(必填項)的值變?yōu)樾詣e列對應(yīng)的值,同時保留兩行并不增加新的行。
方法一:Table.ReplaceValue()替換
= Table.ReplaceValue(源,each [#"性別(必填項)"],each [性別],Replacer.ReplaceValue,{"性別(必填項)"})
方法二:Table.FromRecords()結(jié)合Table.TransformRows()和Record.TransformFields()
Table.FromRecords(Table.TransformRows(源,(row)=>Record.TransformFields(row,{"性別(必填項)", each row[性別]})))
這兩種方法均來源于:https://bondarenkoivan.wordpress.com/2016/12/12/transform-column-using-custom-function-in-power-query-part-2/#more-1033
其中方法二來源于正文,方法一來源于該文讀者的評論。我將方法一排列在前面,是因為我認(rèn)為方法一最簡潔。
這里我殺個回馬槍,當(dāng)我們想到列變換的時候,腦子里首先想到的是Table.TransformColumns()函數(shù),為什么不用它來實現(xiàn)動態(tài)變換呢?
事實上Table.TransformColumns()函數(shù)確實能解決大部分列變換的問題,但是它唯獨(dú)搞不定要動態(tài)引用其他列對應(yīng)值來進(jìn)行相關(guān)計算的問題。這也是為什么來源作者IVAN BONDARENKO絲毫沒有提及這個函數(shù)的緣故。
在PowerBI社區(qū)中,MarcelBeug提到,“With Table.TransformColumns, it is not possible to reference other columns.我之前不知道有這個緣故,套用Table.AddColumn()的方法,引用列名:
= Table.TransformColumns(設(shè)置性別,{"性別(必填項)",each [性別]})
總是提示“Expression.Error: 無法對類型 Text 應(yīng)用字段訪問”的錯誤。
那為什么方法一的Table.ReplaceValue()卻可以引用列名呢?奧秘就在微軟官方對這兩個函數(shù)的官方解釋上。
Table.ReplaceValue()的官方解釋是:
Table.ReplaceValue(table as table, oldValue as any, newValue as any,replacer as function, columnsToSearch as {Text}) as table
Table.TransformColumns()的官方解釋是:
Table.TransformColumns(table as table, transformOperations as list, optional defaultTransformation as nullable function, optional missingField as nullable number) as table
可以看到Table.ReplaceValue()的兩個參數(shù)都是“any”類型,而Table.TransformColumns()的主要參數(shù)是“l(fā)ist”。那我能不能猜想,凡是參數(shù)是“any”類型,就可以自由引用列名,如果不是就不能呢?
我找到了Table.FirstN(),可選參數(shù)的type是“any”:
Table.FirstN( table as table, optional countOrCondition as any) as table
我測試引用列名:
= Table.FirstN(設(shè)置性別,each [性別]="女")
結(jié)果如下:

所以我推測如下:如果函數(shù)參數(shù)type是“any”,就可以自由引用列的內(nèi)容。