Table.Transpose จะกลับด้านตาราง คล้ายกับการ Copy > Paste Special > Transpose ใน Excel โดยข้อมูลในแถวที่ 1 จะกลายเป็นคอลัมน์ที่ 1 แถวที่ 2 เป็นคอลัมน์ที่ 2 ไปเรื่อยๆ
=Table.Transpose(table as table, optional columns as any) as table
=Table.Transpose(table as table, optional columns as any) as table
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table | table | Yes | ตารางที่ต้องการสลับแกน (ต้องส่งเป็น table type) | |
| columns | any | Optional | null | พารามิเตอร์ทางเลือก (ไม่ค่อยได้ใช้) ใช้เพื่อกำหนดว่าจะ Transpose เฉพาะคอลัมน์บางตัวหรือไม่ ส่วนใหญ่ปล่อยไว้เป็น null |
เมื่อข้อมูลถูกเก็บในแนวนอน (เช่น เดือนเป็นคอลัมน์) ต้องการหมุนกลับมาเป็นแนวตั้งเพื่อ Unpivot หรือใช้งานต่อ
บางรายงานมี Header อยู่ในคอลัมน์แรก (Row Header) ต้อง Transpose เพื่อให้ไปอยู่แถวบนสุดก่อน Promote Headers
let Sales = Table.FromRows( {{"Bangkok", 100, 200}, {"Chiang Mai", 150, 250}}, {"City", "Q1", "Q2"} ), Transposed = Table.Transpose(Sales) in Transposedlet
Sales = Table.FromRows(
{{"Bangkok", 100, 200}, {"Chiang Mai", 150, 250}},
{"City", "Q1", "Q2"}
),
Transposed = Table.Transpose(Sales)
in
Transposed
ตารางที่มี 3 แถว 2 คอลัมน์ (Column1 และ Column2)
- แถวที่ 1: [Column1 = "City", Column2 = "Bangkok", Column3 = "Chiang Mai"]
- แถวที่ 2: [Column1 = "Q1", Column2 = 100, Column3 = 150]
- แถวที่ 3: [Column1 = "Q2", Column2 = 200, Column3 = 250]
let Sales = Table.FromRows( {{"Bangkok", 100, 200}, {"Chiang Mai", 150, 250}}, {"City", "Q1", "Q2"} ), Transposed = Table.Transpose(Sales), WithHeaders = Table.…let
Sales = Table.FromRows(
{{"Bangkok", 100, 200}, {"Chiang Mai", 150, 250}},
{"City", "Q1", "Q2"}
),
Transposed = Table.Transpose(Sales),
WithHeaders = Table.PromoteHeaders(Transposed)
in
WithHeaders
ตารางมี Header: City, Bangkok, Chiang Mai (ชื่อคอลัมน์ใหม่)
- แถวที่ 1: [City = "Q1", Bangkok = 100, Chiang Mai = 150]
- แถวที่ 2: [City = "Q2", Bangkok = 200, Chiang Mai = 250]
let Source = Table.FromRows( {{"Fred", 30}, {"Alice", 28}}, {"Name", "Age"} ), Demoted = Table.DemoteHeaders(Source), Transposed = Table.Transpose(Demoted), Res…let
Source = Table.FromRows(
{{"Fred", 30}, {"Alice", 28}},
{"Name", "Age"}
),
Demoted = Table.DemoteHeaders(Source),
Transposed = Table.Transpose(Demoted),
Restored = Table.PromoteHeaders(Transposed)
in
Restored
ตารางที่มี Header: Fred, Alice
- แถวที่ 1: [Fred = "Name", Alice = "Name"]
- แถวที่ 2: [Fred = 30, Alice = 28]
let Attributes = Table.FromRecords({ [Attribute = "Product", January = "Laptop", February = "Laptop", March = "Tablet"], [Attribute = "Price", January = 50000,…let
Attributes = Table.FromRecords({
[Attribute = "Product", January = "Laptop", February = "Laptop", March = "Tablet"],
[Attribute = "Price", January = 50000, February = 45000, March = 15000],
[Attribute = "Stock", January = 10, February = 8, March = 25]
}),
Transposed = Table.Transpose(Attributes),
WithHeaders = Table.PromoteHeaders(Transposed)
in
WithHeaders
ตารางแสดงข้อมูล Product, Price, Stock สำหรับแต่ละเดือน (January, February, March เป็นแถว)
- แถวที่ 1: [Attribute = "Product", Month = "Laptop"]
- แถวที่ 2: [Attribute = "Price", Month = 50000]
- แถวที่ 3: [Attribute = "Stock", Month = 10]
ใช่ครับ เมื่อ Transpose ชื่อคอลัมน์เดิมจะหายไป และ Power Query จะสร้างชื่อคอลัมน์ใหม่ (Column1, Column2…) ให้แทน ถ้าต้องการเก็บชื่อคอลัมน์เดิมเป็นข้อมูล ต้องใช้ Table.DemoteHeaders ก่อน Transpose จากนั้นค่อย Table.PromoteHeaders เพื่อยกแถวแรกขึ้นเป็น Header ใหม่
ส่วนใหญ่ใช้เมื่อข้อมูลมาในรูปแบบ Key-Value หรือ Wide Format ที่ต้องแปลงเป็น Long Format ให้อ่านง่ายขึ้น หรือเวลาได้ข้อมูลแล้วแถวกับคอลัมน์สลับกัน ก็ Transpose เลย มันช่วยอะไรก็ไม่มีแต่ใช้น้อย เพราะส่วนใหญ่ข้อมูลประมาณนี้อยู่แล้ว
เพราะ Transpose เมื่อสลับแถวกับคอลัมน์ Header เดิมจะหายไป ถ้าต้องการเก็บข้อมูล Header ต้องลดระดับเป็นข้อมูลแถวก่อนด้วย DemoteHeaders ทำให้สามารถ Transpose ได้สมบูรณ์
พารามิเตอร์ columns นี่เป็นทางเลือกขั้นสูง ใช้เพื่อระบุคอลัมน์ที่ต้องการ Transpose โดยปล่อยคอลัมน์อื่นไว้ ในทางปฏิบัติ 99% คนใช้ Table.Transpose โดยส่งแค่ parameter แรก (table) ตัว columns มักจะ null หรือไม่ส่ง
Table.Transpose (table, optional columns) ใช้สำหรับสลับแกนตาราง โดยแถวกลายเป็นคอลัมน์ และคอลัมน์กลายเป็นแถว เหมือน Copy > Paste Special > Transpose ใน Excel นั่นแหละ
ที่เจ๋งคือ Transpose มีประโยชน์มากเวลาข้อมูลมาผิดโครงสร้าง เช่นชื่อข้อมูลอยู่คอลัมน์แรก แต่มันควรจะเป็นแถว หรือค่า Key-Value ที่ต้องการแสดงตามคอลัมน์แทนแถว ก็ Transpose เลย แล้วปรับ Header ด้วย PromoteHeaders ตามมา จบเรื่องนั้น!
ส่วนตัวผม Transpose นี่ใช้น้อยมากในโปรเจคจริง แต่มันมีความสุข (joy of BI) ที่เมื่อเจอข้อมูลผิดรูป แล้ว Transpose ได้อย่างแม่นยำ พอขาดแบบนี้นะ จำได้ไหมตอนมี Excel ต้องใช้เมาส์โยนแถวปะคอลัมน์ 555 😎