Table.AddMatchColumn เพิ่มคอลัมน์ใหม่ที่มีค่าจากการแมตช์แถวในตารางอื่น โดยค้นหาค่าที่ตรงกับคีย์ เหมือน VLOOKUP แต่ทำงานโดยตรงบนตารางทั้งหมด
=Table.AddMatchColumn(table as table, newColumnName as text, tableColumnPairs as list, optional joinKind as JoinKind) as table
=Table.AddMatchColumn(table as table, newColumnName as text, tableColumnPairs as list, optional joinKind as JoinKind) as table
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table | table | Yes | ตารางที่ต้องการเพิ่มคอลัมน์ใหม่ | |
| newColumnName | text | Yes | ชื่อของคอลัมน์ใหม่ที่จะสร้าง | |
| tableColumnPairs | list | Yes | รายการคู่ตารางและคอลัมน์สำหรับการแมตช์ โครงสร้าง: {ตารางที่ต้องการหา, {{“คอลัมน์จากตารางแรก”, “คอลัมน์จากตารางที่สอง”}}} | |
| joinKind | JoinKind | Optional | JoinKind.LeftOuter | ประเภทของการเข้าร่วม: JoinKind.LeftOuter (ค่าเริ่มต้น), JoinKind.RightOuter, JoinKind.Inner, JoinKind.FullOuter |
let OrdersTable = Table.FromRecords({ [OrderID = 1, CustomerID = 101, Amount = 500], [OrderID = 2, CustomerID = 102, Amount = 750], [OrderID = 3, CustomerID = 1…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"
let SalesTable = Table.FromRecords({ [SaleID = 1, ProductID = "A001", Qty = 5], [SaleID = 2, ProductID = "B002", Qty = 3], [SaleID = 3, ProductID = "C999", Qty…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
let OrdersTable = Table.FromRecords({ [OrderID = 1, CustomerID = 101, Year = 2024], [OrderID = 2, CustomerID = 102, Year = 2024], [OrderID = 3, CustomerID = 101…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
let EmployeesTable = Table.FromRecords({ [EmpID = 1, EmpName = "John", DeptID = 10], [EmpID = 2, EmpName = "Jane", DeptID = 20], [EmpID = 3, EmpName = "Bob", De…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
ผม้บอกว่า ต่างกันนะครับ 😅 Table.AddJoinColumn ให้ผลลัพธ์ที่ซ้อนกัน (nested record/table) ในคอลัมน์เดียว คุณต้องขยาย (expand) มันหลังจากนั้น ส่วน Table.AddMatchColumn หรือบางครั้งก็ใช้ชื่อว่า Table.AddMergeColumn นั้น ให้เพิ่มคอลัมน์ตรง ๆ ที่เลือกจากตารางอื่น ทำให้ไม่ต้องขยายเพิ่มเติม
มันขึ้นอยู่กับ JoinKind ที่คุณระบุครับ ถ้าใช้ LeftOuter (ค่าเริ่มต้น) แถวเดิมจะยังคงอยู่พร้อมค่า null ในคอลัมน์ใหม่ ถ้าใช้ Inner จะลบแถวนั้นออก ผมแนะนำให้ตรวจสอบว่า key column มีค่าที่ไม่ซ้ำกันหรือมีความเหมาะสม ก่อนรัน
ได้แน่นอนครับ! นั่นคือสิ่งที่เรียกว่า composite key เพียงแค่ระบุหลายคู่ใน tableColumnPairs เช่น {{“Key1”, “Col1”}, {“Key2”, “Col2”}}
ผม้บอกว่า ต้องดูว่าคุณต้องการอะไรครับ Table.Join ทำให้ได้ผลลัพธ์ที่ขยายออกมา คล้ายกับ SQL INNER JOIN หรือ LEFT JOIN ส่วน Table.AddMatchColumn คือเพิ่มคอลัมน์เข้าไปในตารางเดิม มันดูง่ายกว่า และผมชอบใช้มากขึ้นเพราะโค้ดชัดเจน
ต่างกับ Table.Join ครับ Table.AddMatchColumn ใช้ exact match เท่านั้น ถ้าต้องการ fuzzy match หรือ LIKE ต้องใช้ Table.AddColumn ร่วมกับ List.Find หรือ Table.SelectRows แต่นั่นจะช้ากว่า
Table.AddMatchColumn ใช้สำหรับการเพิ่มคอลัมน์ใหม่ลงในตารางโดยการจับคู่ (match) แถวจากตารางอื่น ตามความเหมือนของค่าในคอลัมน์กำหนด ฟังก์ชันนี้คล้ายกับ VLOOKUP ใน Excel แต่ทำงานอย่างเรียบง่าย ไม่ต้องระบุคอลัมน์ที่ต้องการแบบซ้ายไปขวา ใช้ความสำหรับการวนลูปหรือสร้าง custom function ที่รับชื่อ field เป็น parameter
ที่เจ๋งคือ สามารถแมตช์ได้หลายคอลัมน์พร้อมกัน (composite key) และควบคุมได้ว่าจะเก็บแถวที่ไม่มีการแมตช์ (LeftOuter) หรือเอาเฉพาะที่แมตช์ทั้งสองตาราง (Inner) อย่างชัดเจนด้วย JoinKind
ส่วนตัวผมชอบใช้ Table.AddMatchColumn เมื่อต้องการเพิ่มข้อมูลจากตารางอื่นโดยอ้างอิงตามค่ากุญแจ (key) ทำให้โค้ด M ชัดเจนและตรงไปตรงมา มีความปลอดภัยสูงเพราะจะยังคง row context ได้ดี 😎