LOOKUPVALUE เป็นฟังก์ชันค้นหาที่ยืดหยุ่น โดยจะดึงค่าจากคอลัมน์หนึ่งโดยการค้นหาตามเงื่อนไขหลายตัวในเวลาเดียวกัน
=LOOKUPVALUE( <result_columnName>, <search_columnName>, <search_value> [, <alternateResult>] )
=LOOKUPVALUE( <result_columnName>, <search_columnName>, <search_value> [, <alternateResult>] )
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| result_columnName | Column Reference | Yes | คอลัมน์ที่มีค่าที่ต้องการคืนกลับ (ต้องเป็นอ้างอิงคอลัมน์จริง ไม่สามารถเป็น Expression ได้) | |
| search_columnName | Column Reference | Yes | คอลัมน์ที่ต้องการค้นหา (สามารถอยู่ในตารางเดียวกันหรือตารางที่มี Relationship ได้) | |
| search_value | Scalar/Expression | Yes | ค่าที่ต้องการค้นหา (สามารถใส่หลายคู่ของ search_columnName และ search_value ได้) | |
| search_columnName | Column Reference | Optional | คอลัมน์เพิ่มเติมสำหรับเงื่อนไขการค้นหา (สามารถระบุได้หลายคู่กับ search_value) | |
| search_value | Scalar/Expression | Optional | ค่าที่ต้องการค้นหาเพิ่มเติม (จับคู่กับ search_columnName) | |
| alternateResult | Scalar | Optional | Error if no match or multiple different results | ค่าที่คืนกลับเมื่อไม่มีการจับคู่หรือมีการจับคู่หลายแถวแต่ค่าผลลัพธ์ต่างกัน ถ้าไม่ระบุจะเกิด Error |
เช่น ดึงชื่อ/กลุ่ม/สถานะจากตารางมาสเตอร์ด้วยรหัส
เช่น ค้นหาด้วย Date+Currency หรือ Year+Region
กำหนด AlternateResult เพื่อคืน 0/ข้อความ/ค่าอื่นแทน BLANK
Exchange Rate = LOOKUPVALUE( 'Currency Rate'[Average Rate], 'Currency Rate'[CurrencyKey], [CurrencyKey] )Exchange Rate =
LOOKUPVALUE(
'Currency Rate'[Average Rate],
'Currency Rate'[CurrencyKey],
[CurrencyKey]
)
ดึงค่า Average Rate จากตาราง Currency Rate โดยให้ CurrencyKey ตรงกับค่าปัจจุบัน
Shipment Date = LOOKUPVALUE( 'Shipping'[Shipment Date], 'Shipping'[Order ID], [Order ID], 'Shipping'[Product ID], [Product ID] )Shipment Date =
LOOKUPVALUE(
'Shipping'[Shipment Date],
'Shipping'[Order ID],
[Order ID],
'Shipping'[Product ID],
[Product ID]
)
ค้นหาวันที่จัดส่ง โดยให้ทั้ง Order ID และ Product ID ตรงกัน
Channel Name = LOOKUPVALUE( Channels[Channel Name], Channels[Channel ID], [Channel ID], "Unknown Channel" )Channel Name =
LOOKUPVALUE(
Channels[Channel Name],
Channels[Channel ID],
[Channel ID],
"Unknown Channel"
)
ถ้าเจอ Channel ID ที่ตรง จะคืน Channel Name ถ้าไม่เจอจะคืน "Unknown Channel" แทน
Employee Department = LOOKUPVALUE( Employees[Department], Employees[Company ID], [Company ID], Employees[Employee Code], [Employee Code], Employees[Location], […Employee Department =
LOOKUPVALUE(
Employees[Department],
Employees[Company ID],
[Company ID],
Employees[Employee Code],
[Employee Code],
Employees[Location],
[Location],
"Not Found"
)
ค้นหา Department จากตาราง Employees โดยให้ Company ID, Employee Code, และ Location ตรงกัน ถ้าไม่เจอจะคืน "Not Found"
RELATED() ใช้ Relationship ที่มีอยู่ในโมเดลเพื่อดึงค่า มันเร็วกว่าและเหมาะสำหรับการค้นหากรณีที่มี Relationship อยู่แล้ว แต่ LOOKUPVALUE ใช้ได้แม้ไม่มี Relationship หรือต้องค้นหาแบบ many-to-many หรือเงื่อนไขที่ซับซ้อน
จะคืนค่า BLANK หากไม่พบข้อมูลที่ตรงกับเงื่อนไข แต่ถ้ามีหลายแถวที่ตรง แล้วค่าผลลัพธ์ต่างกัน ก็จะเกิด Error (ยกเว้นกำหนด alternateResult)
ได้เลย สามารถใส่หลายคู่ของ search_columnName และ search_value ได้มากเท่าที่ต้องการ แต่ข้อสังเกต ทั้งหมดเงื่อนไขต้องตรงกันพร้อมๆ กัน (AND logic)
เพราะ RELATED() ใช้ประโยชน์จาก Relationship ที่เคยสร้างไว้ในโมเดล ซึ่งมีการ Optimize ไว้แล้ว แต่ LOOKUPVALUE ต้องทำการค้นหาแบบ Scan ทั่วทั้งตาราง ดังนั้นถ้ามี Relationship ให้ใช้ RELATED() ดีกว่า
ใช้ได้ในทั้งสองแบบ แต่มีข้อจำกัด ในหลายกรณี เมื่อใช้ใน Calculated Column มันจะต้อง Scan ทั้งตารางซึ่งอาจช้า ถ้าต้องการประสิทธิภาพดี ให้ใช้ Relationship และ RELATED() ด้วย
LOOKUPVALUE คือฟังก์ชันค้นหาที่มีประสิทธิภาพสูงในการค้นหาค่าจากตารางตามหลายเงื่อนไข
ส่วนตัวผมคิดว่า ถ้าคุณเจอกรณีที่ต้องค้นหาค่าแต่ไม่มี Relationship หรือ Relationship ไม่ตรงตามที่ต้องการ LOOKUPVALUE คือตัวช่วยสุดที่ดี มันสามารถจับคู่กับหลายคอลัมน์พร้อมกันได้เลย 😎
แต่ที่ต้องจำไว้นะ:
– ทุกเงื่อนไขต้องตรงกันพร้อมๆ กัน ถ้าไม่ตรงก็จะได้ BLANK
– ถ้ามีหลายแถวที่ตรง แต่ค่าผลลัพธ์เหมือนกันก็ไม่เป็นไร มันจะคืนค่านั้นให้
– ถ้ามีหลายแถวที่ตรง แต่ค่าผลลัพธ์ต่างกันก็จะเกิด Error (ยกเว้นกำหนด alternateResult)
เทคนิคการใช้งาน:
1. ใช้ LOOKUPVALUE เมื่อไม่มี Relationship หรือ Relationship ไม่เหมาะสม
2. ถ้ามี Relationship อยู่แล้ว ให้ใช้ RELATED() แทน มันจะเร็วกว่า
3. ตัวเลือก alternateResult จะช่วยให้จัดการกับข้อผิดพลาดได้ดีกว่า ISERROR/IFERROR