Thep Excel

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

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

fx
=Table.AddMatchColumn(table, newColumnName, tableColumnPairs, [joinKind]) as table

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

อัปเดต 12 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
table table ตารางที่ต้องการเพิ่มคอลัมน์ใหม่
newColumnName text ชื่อของคอลัมน์ใหม่ที่จะสร้าง
tableColumnPairs list รายการคู่ตารางและคอลัมน์สำหรับการแมตช์ โครงสร้าง: {ตารางที่ต้องการหา, {{“คอลัมน์จากตารางแรก”, “คอลัมน์จากตารางที่สอง”}}}
[joinKind]ไม่บังคับ JoinKind JoinKind.LeftOuter ประเภทของการเข้าร่วม: JoinKind.LeftOuter (ค่าเริ่มต้น), JoinKind.RightOuter, JoinKind.Inner, JoinKind.FullOuter

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

Table.AddMatchColumn ใช้สำหรับการเพิ่มคอลัมน์ใหม่ลงในตารางโดยการจับคู่ (match) แถวจากตารางอื่น ตามความเหมือนของค่าในคอลัมน์กำหนด ฟังก์ชันนี้คล้ายกับ VLOOKUP ใน Excel แต่ทำงานอย่างเรียบง่าย ไม่ต้องระบุคอลัมน์ที่ต้องการแบบซ้ายไปขวา ใช้ความสำหรับการวนลูปหรือสร้าง custom function ที่รับชื่อ field เป็น parameter

ที่เจ๋งคือ สามารถแมตช์ได้หลายคอลัมน์พร้อมกัน (composite key) และควบคุมได้ว่าจะเก็บแถวที่ไม่มีการแมตช์ (LeftOuter) หรือเอาเฉพาะที่แมตช์ทั้งสองตาราง (Inner) อย่างชัดเจนด้วย JoinKind

ส่วนตัวผมชอบใช้ Table.AddMatchColumn เมื่อต้องการเพิ่มข้อมูลจากตารางอื่นโดยอ้างอิงตามค่ากุญแจ (key) ทำให้โค้ด M ชัดเจนและตรงไปตรงมา มีความปลอดภัยสูงเพราะจะยังคง row context ได้ดี 😎

Examples

ตัวอย่างพื้นฐาน – เพิ่มชื่อลูกค้าจากตารางอื่นlet OrdersTable = Table.FromRecords({ [OrderID = 1, CustomerID = 101, Amount = 500], [OrderID = 2, CustomerID = 102, Amount = 750], [OrderID = 3, CustomerID = 1…

เพิ่มชื่อลูกค้า (CustomerName) เข้าไปในตาราง OrdersTable โดยการแมตช์ CustomerID จากทั้งสองตาราง เมื่อหา CustomerID = 101 ในตาราง Customers จะได้ชื่อ "Alice" และใส่เข้าไปในแถวที่ OrderID = 1 และ 3

fx
let
OrdersTable = Table.FromRecords({
[OrderID = 1, CustomerID = 101, Amount = 500],
[OrderID = 2, CustomerID = 102, Amount = 750],
[OrderID = 3, CustomerID = 101, Amount = 1200]
}),
CustomersTable = Table.FromRecords({
[CustomerID = 101, CustomerName = "Alice"],
[CustomerID = 102, CustomerName = "Bob"]
}),
Result = Table.AddMatchColumn(
OrdersTable,
"CustomerName",
{CustomersTable, {{"CustomerID", "CustomerID"}}}
)
in
Result

ผลลัพธ์OrdersTable ขยายเพิ่มคอลัมน์ CustomerName ที่มีค่า "Alice", "Bob", "Alice"
ตัวอย่าง – ใช้ JoinKind.Inner เพื่อเก็บเฉพาะที่แมตช์let SalesTable = Table.FromRecords({ [SaleID = 1, ProductID = "A001", Qty = 5], [SaleID = 2, ProductID = "B002", Qty = 3], [SaleID = 3, ProductID = "C999", Qty…

JoinKind.Inner ทำให้เหลือเฉพาะแถวที่มีการแมตช์ในทั้งสองตาราง ใช้เวลาต้องการ data quality หรือลบ orphan records ออก

fx
let
SalesTable = Table.FromRecords({
[SaleID = 1, ProductID = "A001", Qty = 5],
[SaleID = 2, ProductID = "B002", Qty = 3],
[SaleID = 3, ProductID = "C999", Qty = 2]
}),
ProductsTable = Table.FromRecords({
[ProductID = "A001", ProductName = "Widget A"],
[ProductID = "B002", ProductName = "Widget B"]
}),
Result = Table.AddMatchColumn(
SalesTable,
"ProductName",
{ProductsTable, {{"ProductID", "ProductID"}}},
JoinKind.Inner
)
in
Result

ผลลัพธ์ตารางที่มีเฉพาะแถว SaleID = 1 และ 2 เพราะมีการแมตช์ในตาราง Products แถว SaleID = 3 (ProductID = "C999") ถูกลบออกเพราะไม่พบใน Products
ตัวอย่าง – แมตช์หลายคอลัมน์ (Composite Key)let OrdersTable = Table.FromRecords({ [OrderID = 1, CustomerID = 101, Year = 2024], [OrderID = 2, CustomerID = 102, Year = 2024], [OrderID = 3, CustomerID = 101…

เมื่อต้องการแมตช์โดยใช้หลายคอลัมน์เป็นเกณฑ์ (composite key) ให้ระบุหลายคู่ใน tableColumnPairs ในตัวอย่างนี้ OrderID = 1 จะได้ Discount = 0.10 เพราะตรงกับ CustomerID = 101 AND Year = 2024

fx
let
OrdersTable = Table.FromRecords({
[OrderID = 1, CustomerID = 101, Year = 2024],
[OrderID = 2, CustomerID = 102, Year = 2024],
[OrderID = 3, CustomerID = 101, Year = 2023]
}),
DiscountTable = Table.FromRecords({
[CustomerID = 101, Year = 2024, Discount = 0.10],
[CustomerID = 102, Year = 2024, Discount = 0.05],
[CustomerID = 101, Year = 2023, Discount = 0.0]
}),
Result = Table.AddMatchColumn(
OrdersTable,
"Discount",
{DiscountTable, {{"CustomerID", "CustomerID"}, {"Year", "Year"}}}
)
in
Result

ผลลัพธ์OrdersTable ขยายเพิ่มคอลัมน์ Discount ที่ตรงกับการแมตช์ทั้ง CustomerID และ Year
ตัวอย่าง – ใช้ JoinKind.LeftOuter เพื่อเก็บแถวทั้งหมดlet EmployeesTable = Table.FromRecords({ [EmpID = 1, EmpName = "John", DeptID = 10], [EmpID = 2, EmpName = "Jane", DeptID = 20], [EmpID = 3, EmpName = "Bob", De…

JoinKind.LeftOuter (ค่าเริ่มต้น) ทำให้เก็บแถวทั้งหมดจากตารางแรก และถ้าไม่พบการแมตช์จะใส่ null ลงไป ใช้กรณีที่อยากเห็นข้อมูลที่ไม่มีตัวจับ (orphan records)

fx
let
EmployeesTable = Table.FromRecords({
[EmpID = 1, EmpName = "John", DeptID = 10],
[EmpID = 2, EmpName = "Jane", DeptID = 20],
[EmpID = 3, EmpName = "Bob", DeptID = 99]
}),
DepartmentsTable = Table.FromRecords({
[DeptID = 10, DeptName = "Sales"],
[DeptID = 20, DeptName = "IT"]
}),
Result = Table.AddMatchColumn(
EmployeesTable,
"DeptName",
{DepartmentsTable, {{"DeptID", "DeptID"}}},
JoinKind.LeftOuter
)
in
Result

ผลลัพธ์แถวทั้งสามถูกเก็บไว้ แถว EmpID = 1 และ 2 มี DeptName ส่วน EmpID = 3 มี DeptName = null

FAQs

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

ผม้บอกว่า ต่างกันนะครับ 😅 Table.AddJoinColumn ให้ผลลัพธ์ที่ซ้อนกัน (nested record/table) ในคอลัมน์เดียว คุณต้องขยาย (expand) มันหลังจากนั้น ส่วน Table.AddMatchColumn หรือบางครั้งก็ใช้ชื่อว่า Table.AddMergeColumn นั้น ให้เพิ่มคอลัมน์ตรง ๆ ที่เลือกจากตารางอื่น ทำให้ไม่ต้องขยายเพิ่มเติม

ถ้าไม่พบการแมตช์ สิ่งที่จะเกิดขึ้นคืออะไร?+

มันขึ้นอยู่กับ JoinKind ที่คุณระบุครับ ถ้าใช้ LeftOuter (ค่าเริ่มต้น) แถวเดิมจะยังคงอยู่พร้อมค่า null ในคอลัมน์ใหม่ ถ้าใช้ Inner จะลบแถวนั้นออก ผมแนะนำให้ตรวจสอบว่า key column มีค่าที่ไม่ซ้ำกันหรือมีความเหมาะสม ก่อนรัน

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

ได้แน่นอนครับ! นั่นคือสิ่งที่เรียกว่า composite key เพียงแค่ระบุหลายคู่ใน tableColumnPairs เช่น {{"Key1", "Col1"}, {"Key2", "Col2"}}

แล้ว Table.AddMatchColumn กับ Table.Join ต่างกันอย่างไร?+

ผม้บอกว่า ต้องดูว่าคุณต้องการอะไรครับ Table.Join ทำให้ได้ผลลัพธ์ที่ขยายออกมา คล้ายกับ SQL INNER JOIN หรือ LEFT JOIN ส่วน Table.AddMatchColumn คือเพิ่มคอลัมน์เข้าไปในตารางเดิม มันดูง่ายกว่า และผมชอบใช้มากขึ้นเพราะโค้ดชัดเจน

สามารถใช้กับการหาค่าจากคำของข้อมูล (not exact match) ได้ไหม?+

ต่างกับ Table.Join ครับ Table.AddMatchColumn ใช้ exact match เท่านั้น ถ้าต้องการ fuzzy match หรือ LIKE ต้องใช้ Table.AddColumn ร่วมกับ List.Find หรือ Table.SelectRows แต่นั่นจะช้ากว่า

Resources & Related

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

ฟังก์ชันนี้Table.AddMatchColumnTable functions
Table functions (5)
Table.AddColumn

Table.AddColumn เพิ่มคอลัมน์ใหม่ลงในตารางโดยคำนวณค่าจากฟังก์ชันที่กำหนด ใช้คำสั่ง each เพื่ออ้างอิงข้อมูลในแต่ละแถว เช่น each [Price] * [Quantity] สามารถระบุชนิดข้อมูลได้เพื่อเพิ่มประสิทธิภาพและป้องกันข้อผิดพลาดจากการคาดเดาชนิดข้อมูล ทำงานแบบทีละแถวและเหมาะสำหรับสร้างคอลัมน์คำนวณ รวมข้อมูล ใช้เงื่อนไข และการแปลงข้อมูลต่างๆ ใช้ร่วมกับฟังก์ชัน Table.TransformColumns สำหรับแก้ไขคอลัมน์เดิม Table.AddIndexColumn สำหรับเพิ่มหมายเลขลำดับ Table.SelectRows สำหรับกรองแถว Table.FromRecords สำหรับสร้างตารางจากข้อมูล Text.Combine สำหรับรวมข้อความ Number.Round สำหรับปัดเศษ Date.Year สำหรับดึงค่าปี และ Text.Upper สำหรับแปลงเป็นตัวพิมพ์ใหญ่ เพื่อสร้างกระบวนการแปลงข้อมูลที่สมบูรณ์

Table.AddJoinColumn

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

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

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