之前我們了解到了如何把2列數(shù)據(jù)進行合并的基本操作,Power Query中如何把多列數(shù)據(jù)合并备绽?也就是把多個字段進行組合并轉(zhuǎn)成表券坞。那如果這類的數(shù)據(jù)很多,如何批量轉(zhuǎn)換呢肺素?我們需要把轉(zhuǎn)換的這一部分做成循環(huán)的函數(shù)即可恨锚。
多列組合=(x)=>
Table.Combine(List.Transform({1..x},
? ? ? ? ? ? each Table.FromColumns(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range(字段數(shù)據(jù)列表,0,1)&
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range(字段數(shù)據(jù)列表,(_*3-3)+1,3)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ) ? ? ? ? ?
? ? ? ? ? ? )
這個函數(shù)是在當前查詢功能中進行的書寫,但是實際我們在平時想要調(diào)用的時候压怠,還有很多需要進一步的進行修改及優(yōu)化眠冈。
1.?????生成一個表格參數(shù)變量
生成這個參數(shù)變量是為了我們之后可以在直接調(diào)用來處理同類表格。
我們了解到在代碼中的字段數(shù)據(jù)列表實際上是個已經(jīng)經(jīng)過Table.ToColumns處理過的一個列表嵌套列表格式菌瘫。所以我們在優(yōu)化代碼的時候可以把這一步處理的過程直接作為自定義函數(shù)的部分流程蜗顽。同時我們在這個里面直接把函數(shù)的參數(shù)數(shù)量及類型給固定住。
let
多列組合=(需要操作的表 as table, x as number) as table=>
Table.Combine(List.Transform({1..x},
? ? ? ? ? ? each Table.FromColumns(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),0,1)&
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),(_*3-3)+1,3)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ) ? ? ? ? ?
? ? ? ? ? ? )
in
多列組合
2.?????生成固定列變量
添加固定列終點變量雨让,可以用于固定列的選擇雇盖。
let
多列組合=(需要操作的表 as table, x as number,optional 固定列終點 as number) as table=>
Table.Combine(List.Transform({1..x},
? ? ? ? ? ? each Table.FromColumns(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),0,固定列終點)&
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),(_*3-3)+1,3)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ) ? ? ? ? ?
? ? ? ? ? ? )
in
多列組合
解釋:這里我們把固定列從第1列開始,往后延伸栖忠,例如輸入?yún)?shù)2代表的是從第一列開始崔挖,連續(xù)2列作為固定列贸街。
3.?????確定終點的默認值
既然這個變量是作為可選變量,那我們要給予一個默認值狸相,這樣才不會讓程序出現(xiàn)錯誤薛匪。
我們設(shè)置的默認值為第一列作為固定標題。
let
多列組合=(需要操作的表 as table, x as number, optional 固定列終點 as number) as table=>
Table.Combine(List.Transform({1..x},
? ? ? ? ? ? each Table.FromColumns(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if 固定列終點=null then 1 else 固定列終點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )&
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),(_*3-3)+1,3)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ) ? ? ? ? ?
? ? ? ? ? ? )
in
多列組合
解釋:通過if…then…else語句脓鹃,我們給固定列終點進行一個判斷逸尖,如果為空值則給與一個默認值1,也就是從0開始的1列瘸右,也就是第一列娇跟。
4.?????確定需循環(huán)的列數(shù)
還有一個需要作為變量的,也就是確定是多少列進行轉(zhuǎn)換合并太颤。我們上面的例子中是以每3列進行合并苞俘,但是我們要做為一個能靈活使用的函數(shù),更多的變量能讓我們更方便的使用龄章,適合更多的場景吃谣。
這里我們設(shè)置成為變量y。
let
多列組合=(需要操作的表 as table, x as number, y as number, optional 固定列終點 as number) as table=>
Table.Combine(List.Transform({1..x},
? ? ? ? ? ? each Table.FromColumns(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if 固定列終點=null then 1 else 固定列終點
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )&
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),(_-1)*y+固定列終點),y)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ) ? ? ? ? ?
? ? ? ? ? ? )
in
多列組合
解釋:其中需要注意的是(_-1)*y+固定列終點這個寫法做裙。這個是判斷合并數(shù)據(jù)起始位置的提取基协。_相當于x的需要處理循環(huán)的次數(shù),y相當于需要轉(zhuǎn)換的列數(shù)菇用。
提取的次數(shù)X值Y值固定列終點提取的位置
11311
22314
33317
5.?????添加函數(shù)使用備注
let
多列組合=(需要操作的表 as table, x as number, y as number, optional 固定列終點 as number) as table=>
Table.Combine(List.Transform({1..x},
? ? ? ? ? ? each Table.FromColumns(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if 固定列終點=null then 1 else 固定列終點 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )&
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?List.Range( Table.ToColumns(需要操作的表),((_-1)*y+固定列終點),y)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ) ? ? ? ? ?
? ? ? ? ? ? ),
元數(shù)據(jù)=[Documentation.Name="批量多列合并",
? ? ? Documentation.Description="可以把多列相同的數(shù)據(jù)合并到一起。
第1參數(shù)是需要操作的表陷揪,第2參數(shù)x代表的是循環(huán)幾次惋鸥,第3參數(shù)代表的是多少列循環(huán),第4參數(shù)是固定標題的結(jié)束位置",
? ? ? Documentation.Examples={[Description="第1列為固定列悍缠,每3列進行合并存放卦绣,一共循環(huán)2次",
? ? ? ? ? ? ? ? ? ? ? ? ? ? Code="批量多列合并(源,2,3,1)",
? ? ? ? ? ? ? ? ? ? ? ? ? ? Result=" ?"]
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?]
in
Value.ReplaceType(多列組合,Value.Type(多列組合) meta 元數(shù)據(jù))
這樣我們就做好了一個可以適應(yīng)大部分多列數(shù)據(jù)合并的自定義函數(shù)。
我們可以再來嘗試下不同的數(shù)據(jù)表格來使用此函數(shù)的效果飞蚓。
例1:
像這種固定列有3列滤港,數(shù)據(jù)列是3列為一組,一共轉(zhuǎn)換3次(3組同類數(shù)據(jù))進行組合趴拧。結(jié)果如下圖
因為我們可以直接調(diào)用我們之前的自定義函數(shù)溅漾。
批量多列合并(源,3,3,3)
解釋:批量多列合并,這個是自定義查詢的函數(shù)名稱著榴,源代表的是需處理的數(shù)據(jù)表添履,第2參數(shù)的3代表需要循環(huán)處理的次數(shù),第3參數(shù)的3代表需要合并數(shù)據(jù)的列數(shù)脑又,第4參數(shù)的3代表保留前3列作為固定列暮胧。
例2:
固定列是2列锐借,循環(huán)5次,數(shù)據(jù)列也是2列往衷。使用函數(shù)后獲得的效果钞翔。
批量多列合并(源,5,2,2)
請多多轉(zhuǎn)發(fā)。