看這樣一個題目:將上表轉換成下表
咋一看,還以為就是一個表格轉置的問題,仔細看看,才發現原來中間還是有些曲折:
- 要把項目列展開到日期
- 要把日期變成列
在Power Query中解決問題的方法有很多種,我們今天就從表格變換的角度來思考一下這個問題,針對這個問題,應該分三步走:
- 第一步:數據整理,現有的數據格式逆透視變成一維數據格式
- 第二步:分出單表,每個日期一個表
- 第三步:合并這些表格
數據整理的過程,我們就會發現很多問題,當我們完成逆透視之后,就會發現,這個表格中同一日期下對應著12個項目1,將來我們合并表格時沒有準確的索引,所以我們需要按照日期分組添加一個索引:
然后我們合并屬性與索引作為我們合并表格的鍵值:
到這一步我們的數據整理就做好了。
第二步:拆分表格
這一步的方法有多,最常用的就是Table.Group,根據日期分組,得到31個表格,當然我們也可以換種思路,我們用篩選的方法也可以達成同樣的效果,用Table.SelectRows來獲得每個日期對應的表格,當然要用List.Transforn做個循環,拆分出每個表格。
我們在拆分的同時刪除了日期列,并且用日期給數值列重命名。
let
T=Table.Buffer(S),
源 = List.Transform(
List.Distinct(T[日期]),
(x)=> Table.RenameColumns(
Table.RemoveColumns(
Table.SelectRows(T, each ([日期] = x)),
{"日期"}),
{{"值", Text.From(x)}}))
in
源
let
T=Table.Buffer(S),
源 = List.Transform(
List.Distinct(T[日期]),
(x)=> Table.RenameColumns(
Table.RemoveColumns(
Table.SelectRows(T, each ([日期] = x)),
{"日期"}),
{{"值", Text.From(x)}}))
in
源
- S:是我們整理好的數據源。
- T=Table.Buffer(S):把數據源表緩存,因為我們要重復使用這個表。
- List.Transform的第一參數是數據源中日期列去重復之后的日期列表,第二參數就是用Table.RenameColumns、 Table.RemoveColumns、Table.SelectRows函數組合,篩選表格、刪除列、重命名列。
整體合并之前我么要做個實驗,為了確保數據不遺漏,我們取了兩個日期的表格,10月2日266行,10月31日418行,如果他們的表鍵值完全相同,合并結果應該是418行。
Table.NestedJoin就有點類似Excel中的VLOOKUP函數,我們根據a列的值來匹配數據,JoinKind.FullOuter合并類型是取兩個表的所有行,這樣就確保了數據的完整性。
我們展開之后得到的是418行:
有了這個測試結果,我們就可以開始完成表格合并了:
我們選用List.Accumulate函數來做最終的表格合并
- 第一參數:就是我們拆分好的表格列表
- 第二參數:第一個表,2019/10/1日期對應的表
- 第三參數:用Table.NestedJoin函數合并x,y 表
這個是把拆分表的公式都帶進來的一個公式,看起來有點亂,后面幾步就是為了拆分列,把之前添加的索引去掉。重新排列的結果如下:


