Thep Excel

Table.AddJoinColumnเพิ่มคอลัมน์ Join จากตารางอื่น

Table.AddJoinColumn เชื่อมต่อข้อมูลจากสองตารางตามคีย์ที่ตรงกัน โดยเก็บผลลัพธ์ในคอลัมน์ใหม่เป็นตารางแบบ nested แทนการขยายแนวนอน

fx
= Table.AddJoinColumn(table1, key1, table2, key2, newColumnName)

ความนิยม5/10
ความยาก4/10
ประโยชน์6/10

อัปเดต 6 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
table1 table ตารางหลัก (primary table) ที่ต้องการเพิ่มคอลัมน์ join
key1 text or list ชื่อคอลัมน์ (หรือ list หลายคอลัมน์) ในตารางหลักที่ใช้เป็น key สำหรับ join
table2 function ฟังก์ชันที่ return ตารางที่ต้องการ join กับ (ต้องเขียนเป็น () => TableName)
key2 text or list ชื่อคอลัมน์ (หรือ list หลายคอลัมน์) ในตารางที่ join ที่ต้องการเทียบกับ key1
newColumnName text ชื่อของคอลัมน์ใหม่ที่จะเก็บผลลัพธ์ join (เป็นตารางแบบ nested)

Additional Notes

Table.AddJoinColumn รับตารางหลัก ตารางที่ join กับ และข้อกำหนดว่าจะเชื่อมตามคอลัมน์ไหน ผลลัพธ์จะปรากฏในคอลัมน์ใหม่เป็นตารางแบบซ้อน (nested table) ไม่ flatten แบบแนวนอน เป็น LeftOuter join หมายความว่าแถวทั้งหมดจากตารางหลักคงไว้ เพียงแต่เพิ่มข้อมูล match จากตารางที่ join

ที่เจ๋งคือ Table.AddJoinColumn ช่วยให้เก็บความสัมพันธ์ระหว่างข้อมูล (relationship) ไว้ได้อย่างชัดเจน แถมสามารถเลือกว่าจะ expand (flatten) ออกมากี่คอลัมน์ก็ได้ ต่างจาก Table.Join ที่ flatten ทั้งหมดจึงเสียความยืดหยุ่น สำหรับ performance มันก็ดี เพราะเก็บตารางแยกกันไว้

ส่วนตัวผมใช้ฟังก์ชันนี้เวลาต้องการเก็บข้อมูล detail ไว้ก่อน แล้วค่อย expand เฉพาะคอลัมน์ที่ต้องการหลังจากนั้น มันให้ความยืดหยุ่นมากเวลาต้องแก้ไข logic ของ join ได้ง่ายขึ้น 😎

How it works

Custom Join implementation

Custom Join implementation

Examples

Join ตารางขายกับตารางราคาlet Sales = Table.FromRecords({ [SaleID = 1, Item = "Shirt"], [SaleID = 2, Item = "Hat"], [SaleID = 3, Item = "Shoes"] }), PriceData = Table.FromRecords({ [Sale…

ทำ left join Sales กับ PriceData ตาม SaleID โดยใส่ผลลัพธ์ลงในคอลัมน์ PriceInfo แบบ nested table ซึ่งแต่ละเซลล์จะมีตารางเล็กๆ ที่มีข้อมูล price ทั้งหมด match กับ row นั้นๆ

fx
let
Sales = Table.FromRecords({
[SaleID = 1, Item = "Shirt"],
[SaleID = 2, Item = "Hat"],
[SaleID = 3, Item = "Shoes"]
}),
PriceData = Table.FromRecords({
[SaleID = 1, Price = 200, Stock = 50],
[SaleID = 2, Price = 150, Stock = 80],
[SaleID = 1, Price = 180, Currency = "USD"]
}),
Result = Table.AddJoinColumn(Sales, "SaleID", () => PriceData, "SaleID", "PriceInfo")
in
Result

ผลลัพธ์ตารางขาย 3 แถว + คอลัมน์ PriceInfo ใหม่ที่มีตารางแบบ nested
Join กับข้อมูลจาก Query อื่นใน Excellet Orders = Source, CustomerInfo = () => Excel.CurrentWorkbook(){[Name="Customers"]}[Content], Result = Table.AddJoinColumn(Orders, "CustomerID", CustomerInfo,…

Join ตาราง Orders (query ปัจจุบัน) กับ Customers query ที่อยู่ใน Excel workbook เดียวกัน โดยเก็บข้อมูล Customer detail ไว้ในคอลัมน์ nested

fx
let
Orders = Source,
CustomerInfo = () => Excel.CurrentWorkbook(){[Name="Customers"]}[Content],
Result = Table.AddJoinColumn(Orders, "CustomerID", CustomerInfo, "CustomerID", "Customer")
in
Result

ผลลัพธ์ตาราง Orders ที่มีคอลัมน์ Customer ใหม่เป็นตารางแบบ nested
Join หลายคอลัมน์ด้วย Composite Keylet Table1 = Table.FromRecords({ [Year = 2024, Month = 1, Sales = 1000], [Year = 2024, Month = 2, Sales = 1500], [Year = 2025, Month = 1, Sales = 2000] }), Tabl…

Join ตั้งแต่ 2 คอลัมน์พร้อมกัน (Year และ Month) ต้องมีค่าทั้ง Year และ Month ตรงกันกับตารางที่ join ใช้ list {"Col1", "Col2", …} เพื่อระบุ composite key

fx
let
Table1 = Table.FromRecords({
[Year = 2024, Month = 1, Sales = 1000],
[Year = 2024, Month = 2, Sales = 1500],
[Year = 2025, Month = 1, Sales = 2000]
}),
Table2 = Table.FromRecords({
[Year = 2024, Month = 1, Target = 1200],
[Year = 2024, Month = 2, Target = 1400],
[Year = 2025, Month = 1, Target = 2200]
}),
Result = Table.AddJoinColumn(Table1, {"Year", "Month"}, () => Table2, {"Year", "Month"}, "TargetInfo")
in
Result

ผลลัพธ์ตาราง Table1 + คอลัมน์ TargetInfo ที่มีตาราง Target details
Join แล้ว Expand บางคอลัมน์เท่านั้นlet Orders = Table.FromRecords({ [OrderID = 1, OrderDate = #date(2024,1,1)], [OrderID = 2, OrderDate = #date(2024,1,2)] }), OrderDetails = Table.FromRecords({ […

แสดงวิธี combine Table.AddJoinColumn กับ Table.ExpandTableColumn เพื่อให้ได้ผลลัพธ์ flatten แต่เฉพาะคอลัมน์ที่ต้องการเท่านั้น อันนี้เป็นวิธีใจความที่ดีมากครับ

fx
let
Orders = Table.FromRecords({
[OrderID = 1, OrderDate = #date(2024,1,1)],
[OrderID = 2, OrderDate = #date(2024,1,2)]
}),
OrderDetails = Table.FromRecords({
[OrderID = 1, Product = "Chair", Qty = 2],
[OrderID = 1, Product = "Desk", Qty = 1],
[OrderID = 2, Product = "Lamp", Qty = 3]
}),
Joined = Table.AddJoinColumn(Orders, "OrderID", () => OrderDetails, "OrderID", "Details"),
Expanded = Table.ExpandTableColumn(Joined, "Details", {"Product", "Qty"}, {"Product", "Qty"})
in
Expanded

ผลลัพธ์ตาราง Orders ที่มีคอลัมน์ Product และ Qty ขยายออกมา โดยแถวเพิ่มเติมสำหรับแต่ละ Product

FAQs

ต่างจาก Table.Join อย่างไร?+

Table.Join จะ flatten ผลลัพธ์ออกมาเป็นแถวแยก (multiplication ของแถว) แต่ Table.AddJoinColumn จะเก็บผลลัพธ์ join เป็นตารางแบบ nested ในคอลัมน์เดียว ซึ่งให้ความยืดหยุ่นมากว่า แล้วค่อย expand บางคอลัมน์หรือทั้งหมดก็ได้

ทำไม table2 ต้องเป็น function แบบ () => ?+

เพราะ Power Query จะประมวลผล function นี้อย่างมีประสิทธิภาพ โดยรอจนกว่าจะประเมินค่า key ใน table1 เสร็จสิ้นก่อน หลังจากนั้นค่อยเรียกใช้ table2 ช่วยหลีกเลี่ยงการโหลดตารางทั้งหมดล่วงหน้า และช่วย performance ได้เยอะ ผมแนะนำให้เสมอเขียน () => TableName

ถ้าไม่มีค่า key ที่ match ใน table2 จะเป็นยังไง?+

จะได้ตารางว่าง (empty table) ในคอลัมน์ nested ของแถวนั้น เพราะเป็น LeftOuter join มีความหมายว่าแถวจาก table1 ยังอยู่แม้ว่าไม่มี match ใน table2 หากต้องการ inner join (เก็บเฉพาะที่มี match) ต้องใช้ Table.Join แทน

สามารถ join หลายคอลัมน์พร้อมกันได้ไหม?+

ได้ครับ ใช้ list {"Column1", "Column2", "Column3", …} แทนชื่อคอลัมน์เดี่ยว เวลานี้ Power Query จะต้องมีค่าทั้งหมดตรงกัน (composite key)

เวลา join กับตารางที่มี 1 หลาย (1 to many) จะเป็นยังไง?+

ผลก็คือคอลัมน์ nested จะมีหลายแถว สำหรับแต่ละแถวจาก table1 ตัวอย่างเช่น order 1 อัน มี product 3 ชนิด คอลัมน์ nested จะเป็นตาราง 3 แถว ผมแนะนำให้ expand มาดูชัดๆ ว่าข้อมูลตรงกับที่คิดไหม

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ Table.AddJoinColumn จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้Table.AddJoinColumnTable functions
Table functions (6)
Table.AddMatchColumn

Table.AddMatchColumn เพิ่มคอลัมน์ใหม่ที่มีค่าจากการแมตช์แถวในตารางอื่น โดยค้นหาค่าที่ตรงกับคีย์ เหมือน VLOOKUP แต่ทำงานโดยตรงบนตารางทั้งหมด

Table.ExpandTableColumn

Table.ExpandTableColumn ใช้แตกข้อมูลจากคอลัมน์ที่เป็น nested table ออกมาเป็นคอลัมน์และแถวปกติในตารางหลัก โดยรักษาข้อมูลคอลัมน์อื่นไว้ และทำซ้ำแถวหลักสำหรับแต่ละแถวในตารางซ้อน มักใช้คู่กับ Table.NestedJoin หลัง join ตาราง หรือใช้ขยายข้อมูลจากแหล่งที่มีโครงสร้างแบบ hierarchical เช่น JSON หรือ API

Table.FromRecords

แปลง List ของ Record เป็นตาราง โดยแต่ละ Record กลายเป็นหนึ่งแถว เหมาะสำหรับข้อมูลจาก API หรือ JSON

Table.Join

Table.Join ใช้รวมตารางสองตารางโดยจับคู่ค่าในคอลัมน์กำหนด สนับสนุนทุกประเภท join (Inner, Left Outer, Right Outer, Full Outer, Anti, Semi) เหมือน SQL Join

Table.NestedJoin

Table.NestedJoin เชื่อมตารางสองตารางด้วยคีย์ที่กำหนด และสร้างคอลัมน์ใหม่ที่เก็บตารางย่อยของแถวที่จับคู่ได้ เหมาะกับงาน Merge ที่ต้องการเก็บรายละเอียดฝั่งขวาไว้เป็น nested table ก่อนจะ Expand หรือทำขั้นตอนต่อ

Table.SelectRows

Table.SelectRows เป็นฟังก์ชันสำหรับกรองตาราง (filter table) ใน Power Query โดยใช้ฟังก์ชันเงื่อนไข (condition function) เพื่อตรวจสอบแต่ละแถว ถ้าเงื่อนไขคืนค่า true จะเก็บแถวนั้นไว้ ถ้าเป็น false จะตัดทิ้ง สามารถใช้ keyword 'each' ร่วมกับการอ้างอิงคอลัมน์ด้วย [ColumnName] เพื่อเขียนเงื่อนไขได้สะดวก รองรับการกรองตามตัวเลข ข้อความ วันที่ การตรวจสอบค่า null และเงื่อนไขที่ซับซ้อนด้วย and/or operators ฟังก์ชันนี้รองรับ Query Folding ซึ่งช่วยเพิ่มประสิทธิภาพเมื่อทำงานกับ data source ขนาดใหญ่

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่