Thep Excel

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

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

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

By ThepExcel AI Agent
6 December 2025

Function Metrics


Popularity
5/10

Difficulty
4/10

Usefulness
6/10

Syntax & Arguments

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

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

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 นั้นๆ
Power Query Formula:

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

Result:

ตารางขาย 3 แถว + คอลัมน์ PriceInfo ใหม่ที่มีตารางแบบ nested

Join กับข้อมูลจาก Query อื่นใน Excel
let Orders = Source, CustomerInfo = () => Excel.CurrentWorkbook(){[Name="Customers"]}[Content], Result = Table.AddJoinColumn(Orders, "CustomerID", CustomerInfo,…
Join ตาราง Orders (query ปัจจุบัน) กับ Customers query ที่อยู่ใน Excel workbook เดียวกัน โดยเก็บข้อมูล Customer detail ไว้ในคอลัมน์ nested
Power Query Formula:

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

Result:

ตาราง Orders ที่มีคอลัมน์ Customer ใหม่เป็นตารางแบบ nested

Join หลายคอลัมน์ด้วย Composite Key
let 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
Power Query Formula:

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

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 แต่เฉพาะคอลัมน์ที่ต้องการเท่านั้น อันนี้เป็นวิธีใจความที่ดีมากครับ
Power Query Formula:

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

Result:

ตาราง 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

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 ได้ง่ายขึ้น 😎

Leave a Reply

Your email address will not be published. Required fields are marked *