Table容器是Power Query中處理結構化數據的核心工具,也就是我們俗稱的資料表(Data Table)。透過行、列方式儲存資料,可以執行篩選、合併、轉置等多樣操作,滿足數據清理與轉換的需求。Table容器在資料整合中更扮演重要角色,可以整合多個來源數據,也是進行複雜分析的基礎,能與Excel及Power BI無縫對接,支援樞紐分析、動態報表等。熟練掌握Table容器不僅能提升工作效率,還有助於應對多樣化的數據分析需求,是瞭解與學習Power Query的關鍵一步。
Table(資料表格)
Power Query所論及的Table(表格)指的資料表(Data Table),是縱向行(Column)和橫向列(Row)結構所組成一系列二維陣列資料結構(Array Data Structure)的集合,是資料庫(Database)的主要儲存元件。匯入外部資料至Power Query查詢編輯器環境,即是資料表形式的查詢結果。
使用M語法建立資料表
除了匯入外部資料產生資料表查詢外,在Power Query查詢編輯器裡,也可以利用M語言的#table函數,輕鬆建立一個資料表。而#table的語法為:
#table(columns as any, rows as any) as any
其中第1個參數columns是資料行名稱(也就是欄位名稱),以List架構來撰寫,而第2個參數rows也可以是List的結構,List裡的每個項目元素便是包含資料表裡的各欄位名稱,以及每一筆資料列的各欄位內容。。
例如:
單欄且單一儲存格的表格,若表示姓名為 陳小華,則可以寫成:
=#table({"姓名"},{{"陳小華"}})
這是一個單欄單筆資料列的Table。

如果所建立的Table是三個資料行,也就是包含三個資料欄位(姓名、工時、時薪)的1列資料("陳小華",82,575),則建立此表格的M語法為:
=#table({"姓名","工時","時薪"},{{"陳小華",82,575}})
在預設狀態下資料行都是any資料型態的查詢結果。

若要建立多欄多列的資料表,例如延續剛剛的實作內容,可以撰寫出三個資料欄位、4筆資料列的表格:
=#table({"姓名","工時","時薪"},{{"陳小華",82,575},{"李大同",74,846},{"黃玉琳",56,756},{"趙文豐",68,1024}})

Table裡包含List
原本在資料表的設計上,如果欄位裡的內容允許填入多項資料,而非只是基元值(Atomic Value),則該欄位的資料型態,若是設定為List容器,將是不錯的選擇。例如:一個資料表裡要儲存個人基本資料,包含[工號]、[姓名]與[專長],其中[工號]及[姓名]都設定為文字型態是頗為適宜的,而若一個以上的多項專長也都可以儲存,則[專長]設定為List(清單)資料型態,應該也是不錯的選擇。以下我們就利用M語言程式編碼的撰寫,來建立一個Table裡的資料欄位也包含List資料型態的範例。內容為3筆資料記錄,3個資料欄位,其中[專長]資料行的內容是List。
工號 | 姓名 | 專長 |
EM092 | 李正華 | List(內容是:程式設計,音樂,繪畫,Excel) |
EM094 | 黃梅如 | List(內容是:日文,舞蹈) |
EM095 | 邱政寬 | List(內容是:品管,法語,駕駛) |
程式編碼如下:
=#table({"工號","姓名","專長"},{{"EM092","李正華",{"程式設計","音樂","繪畫","Excel"}},{"EM094","黃梅如",{"日文","舞蹈"}},{"EM095","邱政寬",{"品管","法語","駕駛"}}})
在預設狀態下資料行都是any資料型態,但是[專長]資料行的內容則是可以繼續深入查詢的List資料型態。

我想剛剛的程式碼編輸入,最頭痛的應該就是括號的對應了吧!正如先前的學習與實作,這些多層次的大括號、小括號都有其意義,缺一不可,但是都連串撰寫也實在難以閱讀與檢視,撰寫時適度的按下Enter按鍵進行分行,不但有助於編輯也提高了可讀性。
=#table({"工號","姓名","專長"},
{
{"EM092","李正華",{"程式設計","音樂","繪畫","Excel"}},
{"EM094","黃梅如",{"日文","舞蹈"}},
{"EM095","邱政寬",{"品管","法語","駕駛"}}
}
)
Table裡包含Record與Table
那麼,上述兩個查詢其實也可以成為另一個查詢內容喔!例如:再建立一個名為[員工名冊]的查詢,這也是一個Table資料型態的內容。共有5個資料欄位的表格,分別是[工號]、[姓名]、[基本個資]、[眷屬資料]與[興趣],其中,[工號]與[姓名]資料行都是文字型態的內容,而[基本個資]資料則描述著員工的個資,因此,可以建立Record資料型態的內容,以此例而言,藉由Record語法,建立[性別]、[年齡]與[學歷]等3的資料欄位的記錄。而[眷屬資料]資料行是儲存員工的眷屬資料,是以資料表容器的格式呈現,且資料表包含了[姓名]、[稱謂]與[年齡]等3個資料行。至於最後一個[興趣]資料行則是List資料型態的內容。

此資料表的程式編碼如下:
let
來源 = #table({"工號","姓名","基本個資","眷屬","興趣"}, {
{"E203","孫志勇",[性別="男",年齡=38,學歷="碩士"],#table({"姓名","稱謂","年齡"},{{"孫正德","父",62},{"趙蕙蘭","妻",29},{"孫和庭","長子",6},{"孫莉美","長女",3}}),{"運動","閱讀","攝影","旅遊"}},
{"E205","李曉雯",[性別="女",年齡=52,學歷="EMBA"],#table({"姓名","稱謂","年齡"},{{"林月卿","母",77},{"李成桂","父",81},{"周孟隆","夫",55},{"周家豪","長子",23},{"周品妍","長女",21}}),{"音樂","游泳","繪畫"}},
{"E206","蕭尹文",[性別="男",年齡=46,學歷="專科"],#table({"姓名","稱謂","年齡"},{{"沈珊如","妻",47},{"蕭勝宏","父",72},{"蕭子晴","長女",18},{"馮詠晴","次女",18},{"蕭承恩","長子",15}}),{"運動","健身","衝浪"}},
{"E208","馮怡君",[性別="女",年齡=28,學歷="大學"],#table({"姓名","稱謂","年齡"},{{"馮進財","父",58},{"林玉蘭","母",50},{"馮冠廷","弟",25}}),{"瑜珈","園藝","烹飪","旅遊","寫作"}}
})
in
來源
全部容器都撰寫在一起的敘述雖然沒有多少行程式碼,但閱讀與除錯並不容易。所以,有規則、有規律的分行、分段,調整成適度的查詢步驟,程式碼就必較容易維護。

從上述的實作練習一定可以讓您體驗到M語言的資料型態與三大容器List、Record與Table的特性及彼此的關係。基本上,在實務應用中我們並不太會親自鍵入M語言程式編碼來建立新的資料,而是從外部資料來源匯入需要處理、拆分、彙整、運算與清洗的大量資料與多方來源的異質性資料。而這些資料來源的資料型態與特徵,正如我們實作中所看到的這些資料庫名詞、圖示、功能與處理基礎,因此,相信在面臨這些內容時您就有能力可以處理與面對。

Power Query三大容器實作系列
- <<Power Query三大容器實作系列 - (1/7) Power Query的資料型態>>
- <<Power Query三大容器實作系列 - (2/7) Power Query的三大容器>>
- <<Power Query三大容器實作系列 - (3/7) Power Query List的建立與編輯>>
- <<Power Query三大容器實作系列 - (4/7) 向下切入:深化(擷取)容器裡的內容>>
- <<Power Query三大容器實作系列 - (5/7) – 關於List的索引值>>
- <<Power Query三大容器實作系列 - (6/7) Record(記錄)的建立編輯與轉換>>
- <<Power Query三大容器實作系列 - (7/7) Table(資料表格)的建立編輯與轉換>>