VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้
=VALUES(<TableNameOrColumnName>)
=VALUES(<TableNameOrColumnName>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| TableNameOrColumnName | Column or Table | Yes | ชื่อคอลัมน์หรือตารางที่ต้องการดึงค่าที่ไม่ซ้ำ ต้องเป็นข้อมูลจริงจากโมเดล Data ไม่สามารถใช้ตัวแปร VAR ได้ |
ใช้ VALUES(Product[Color]) ใน SUMX เพื่อวนคำนวณยอดขายทีละสี
ใช้แสดงข้อความว่าผู้ใช้กำลังเลือกดูข้อมูลของใครอยู่ (เช่น "Sales Report for: John")
Unique Products = COUNTROWS(VALUES(Products[ProductID]))Unique Products = COUNTROWS(VALUES(Products[ProductID]))
จำนวนเต็ม เช่น 50 (สมมติว่ามีผลิตภัณฑ์ 50 รายการที่ไม่ซ้ำ)
Unique Orders = CALCULATE( COUNTROWS(VALUES(Orders[OrderNumber])), Products[Category] = "Electronics" )Unique Orders = CALCULATE(
COUNTROWS(VALUES(Orders[OrderNumber])),
Products[Category] = "Electronics"
)
จำนวนใบสั่งซื้อที่ไม่ซ้ำสำหรับหมวดหมู่ Electronics
Integrity Check = VAR SalesProducts = COUNTROWS(VALUES(Sales[ProductID])) VAR MasterProducts = COUNTROWS(ALL(Products)) RETURN IF(SalesProducts > MasterProducts…Integrity Check =
VAR SalesProducts = COUNTROWS(VALUES(Sales[ProductID]))
VAR MasterProducts = COUNTROWS(ALL(Products))
RETURN
IF(SalesProducts > MasterProducts, "มีข้อมูล Sales ที่ไม่มีใน Master", "ข้อมูลสะอาด")
ข้อความ "มีข้อมูล Sales ที่ไม่มีใน Master" หรือ "ข้อมูลสะอาด"
Total Store Rows = COUNTROWS(VALUES(Store))Total Store Rows = COUNTROWS(VALUES(Store))
จำนวนแถวทั้งหมดในตาราง Store รวมแถว BLANK ถ้ามี
Average Sales by Category = AVERAGEX( VALUES(Products[Category]), CALCULATE(SUM(Sales[Amount])) )Average Sales by Category =
AVERAGEX(
VALUES(Products[Category]),
CALCULATE(SUM(Sales[Amount]))
)
ค่าเฉลี่ยของยอดขายรายหมวดหมู่
VALUES รวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (referential integrity violations) ขณะที่ DISTINCT ไม่รวม DISTINCT ยังสามารถทำงานกับตัวแปร VAR ได้ แต่ VALUES ไม่ได้ ส่วนใหญ่ DISTINCT มักใช้บ่อยกว่า VALUES ใน DAX ปัจจุบัน แต่ VALUES ยังมีประโยชน์สำหรับการตรวจสอบคุณภาพข้อมูล
VALUES ไม่ส่งค่ากลับเป็นสเกลาร์ (scalar value) มันส่งกลับ Table object ดังนั้นต้องใช้ร่วมกับฟังก์ชันอื่นเช่น COUNTROWS SUMX AVERAGEX หรือ FILTER เพื่อให้ได้ผลลัพธ์ที่มีประโยชน์
ไม่ได้ VALUES ไม่รองรับใน DirectQuery mode สำหรับ Calculated Columns หรือ RLS Rules คุณต้องใช้โหมด Import หรือ Dual
SELECTEDVALUE ส่งค่าเดี่ยวกลับ (scalar) เมื่อมีการเลือกเพียงค่าเดียว ในขณะที่ VALUES ส่งตาราง Table ของค่าทั้งหมด Microsoft แนะนำให้ใช้ SELECTEDVALUE แทน VALUES ในกรณีส่วนใหญ่ เพราะมีประสิทธิภาพและความปลอดภัยมากขึ้น
VALUES จะคำนึงถึง Filter Context ที่มีอยู่ หากคุณกำลังดูข้อมูลสำหรับหมวดหมู่เดี่ยว VALUES จะดึงค่าที่ไม่ซ้ำเฉพาะในหมวดหมู่นั้น หากต้องการไม่สนใจ Filter Context ให้ใช้ ALLEXCEPT หรือ ALL
เพราะ VALUES คืนค่าเป็นตาราง แต่คุณกำลังพยายามนำไปใช้ในที่ที่ต้องการค่าเดี่ยว (Scalar) วิธีแก้คือใช้ IF(HASONEVALUE(…), VALUES(…)) หรือใช้ SELECTEDVALUE แทน
VALUES เป็นฟังก์ชันหลักของ DAX ที่ใช้ดึงค่าที่ไม่ซ้ำ (distinct values) จากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง สิ่งที่เจ๋งของ VALUES คือมันสามารถจัดการกับข้อผิดพลาดของความสัมพันธ์ในข้อมูลได้
สำหรับตัวอย่าง หากคุณมีตาราง Sales ที่มีความสัมพันธ์กับตาราง Products แต่มีบางแถวใน Sales ที่อ้างอิงถึง Product ID ที่ไม่มีอยู่จริงใน Products VALUES ก็จะรวมแถว BLANK นี้ไว้ด้วย ในขณะที่ DISTINCT จะละเว้นมันไป
ส่วนตัวผม VALUES มีประโยชน์มากเมื่อคุณทำงานกับข้อมูลที่ไม่สะอาด หรือต้องการนับค่าที่ไม่ซ้ำพร้อมกับการตรวจสอบปัญหาของความสัมพันธ์ข้อมูลด้วย แม้ว่าใน DAX 2019 ขึ้นไป Microsoft แนะนำให้ใช้ DISTINCT เป็นหลักมากขึ้น แต่ VALUES ยังคงเป็นตัวเลือกที่ดีสำหรับกรณีพิเศษ 😎