Thep Excel

VALUES – ดึงค่าที่ไม่ซ้ำจากคอลัมน์ (รวม Blank จากข้อผิดพลาดความสัมพันธ์)

VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้

=VALUES(<TableNameOrColumnName>)

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
8/10

Difficulty
4/10

Usefulness
8/10

Syntax & Arguments

=VALUES(<TableNameOrColumnName>)

Argument Type Required Default Description
TableNameOrColumnName Column or Table Yes ชื่อคอลัมน์หรือตารางที่ต้องการดึงค่าที่ไม่ซ้ำ ต้องเป็นข้อมูลจริงจากโมเดล Data ไม่สามารถใช้ตัวแปร VAR ได้

How it works

ใช้เป็นตัวตั้งต้นในการวนลูป (Iterator)

ใช้ VALUES(Product[Color]) ใน SUMX เพื่อวนคำนวณยอดขายทีละสี

คืนค่าชื่อที่ถูกเลือกใน Slicer

ใช้แสดงข้อความว่าผู้ใช้กำลังเลือกดูข้อมูลของใครอยู่ (เช่น "Sales Report for: John")

Examples

นับจำนวนผลิตภัณฑ์ที่ไม่ซ้ำ
Unique Products = COUNTROWS(VALUES(Products[ProductID]))
VALUES ดึงรายการผลิตภัณฑ์ที่ไม่ซ้ำทั้งหมด แล้ว COUNTROWS นับจำนวนแถว หากมีข้อผิดพลาดของความสัมพันธ์ VALUES จะรวมแถว BLANK ไว้ด้วย ต่างจาก DISTINCT ที่จะตัด BLANK ออก
DAX Formula:

Unique Products = COUNTROWS(VALUES(Products[ProductID]))

Result:

จำนวนเต็ม เช่น 50 (สมมติว่ามีผลิตภัณฑ์ 50 รายการที่ไม่ซ้ำ)

นับใบสั่งซื้อที่ไม่ซ้ำในแต่ละหมวดหมู่
Unique Orders = CALCULATE( COUNTROWS(VALUES(Orders[OrderNumber])), Products[Category] = "Electronics" )
ใช้ CALCULATE รวมกับ VALUES เพื่อนับใบสั่งซื้อที่ไม่ซ้ำพร้อมกับเคารพ Filter Context ของการเลือกหมวดหมู่ Products
DAX Formula:

Unique Orders = CALCULATE(
  COUNTROWS(VALUES(Orders[OrderNumber])),
  Products[Category] = "Electronics"
)

Result:

จำนวนใบสั่งซื้อที่ไม่ซ้ำสำหรับหมวดหมู่ Electronics

ตรวจสอบข้อผิดพลาดของความสัมพันธ์ข้อมูล
Integrity Check = VAR SalesProducts = COUNTROWS(VALUES(Sales[ProductID])) VAR MasterProducts = COUNTROWS(ALL(Products)) RETURN IF(SalesProducts > MasterProducts…
VALUES รวมแถว BLANK จากข้อมูลที่ไม่มีความสัมพันธ์ได้ สามารถนำมาเปรียบเทียบกับจำนวนสินค้าใน Master เพื่อตรวจสอบข้อผิดพลาด
DAX Formula:

Integrity Check = 
VAR SalesProducts = COUNTROWS(VALUES(Sales[ProductID]))
VAR MasterProducts = COUNTROWS(ALL(Products))
RETURN
  IF(SalesProducts > MasterProducts, "มีข้อมูล Sales ที่ไม่มีใน Master", "ข้อมูลสะอาด")

Result:

ข้อความ "มีข้อมูล Sales ที่ไม่มีใน Master" หรือ "ข้อมูลสะอาด"

ใช้ VALUES กับตารางทั้งหมด
Total Store Rows = COUNTROWS(VALUES(Store))
เมื่อส่งตารางทั้งหมดให้ VALUES มันจะดึงแถวทั้งหมด และหากมีแถว BLANK จากข้อผิดพลาดของความสัมพันธ์จะรวมไว้ด้วย
DAX Formula:

Total Store Rows = COUNTROWS(VALUES(Store))

Result:

จำนวนแถวทั้งหมดในตาราง Store รวมแถว BLANK ถ้ามี

วนลูปคำนวณด้วย SUMX
Average Sales by Category = AVERAGEX( VALUES(Products[Category]), CALCULATE(SUM(Sales[Amount])) )
VALUES สร้างตารางหมวดหมู่ที่ไม่ซ้ำ แล้ว AVERAGEX วนลูปคำนวณยอดขายของแต่ละหมวดหมู่ ก่อนจะหาค่าเฉลี่ย
DAX Formula:

Average Sales by Category = 
AVERAGEX(
  VALUES(Products[Category]),
  CALCULATE(SUM(Sales[Amount]))
)

Result:

ค่าเฉลี่ยของยอดขายรายหมวดหมู่

FAQs

VALUES กับ DISTINCT ต่างกันอย่างไร?

VALUES รวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (referential integrity violations) ขณะที่ DISTINCT ไม่รวม DISTINCT ยังสามารถทำงานกับตัวแปร VAR ได้ แต่ VALUES ไม่ได้ ส่วนใหญ่ DISTINCT มักใช้บ่อยกว่า VALUES ใน DAX ปัจจุบัน แต่ VALUES ยังมีประโยชน์สำหรับการตรวจสอบคุณภาพข้อมูล

ทำไม VALUES ต้องใช้เป็นฟังก์ชัน Nested ไม่สามารถใช้คนเดียวได้?

VALUES ไม่ส่งค่ากลับเป็นสเกลาร์ (scalar value) มันส่งกลับ Table object ดังนั้นต้องใช้ร่วมกับฟังก์ชันอื่นเช่น COUNTROWS SUMX AVERAGEX หรือ FILTER เพื่อให้ได้ผลลัพธ์ที่มีประโยชน์

ใช้ VALUES กับ DirectQuery ได้ไหม?

ไม่ได้ VALUES ไม่รองรับใน DirectQuery mode สำหรับ Calculated Columns หรือ RLS Rules คุณต้องใช้โหมด Import หรือ Dual

VALUES กับ SELECTEDVALUE ต่างกันอย่างไร?

SELECTEDVALUE ส่งค่าเดี่ยวกลับ (scalar) เมื่อมีการเลือกเพียงค่าเดียว ในขณะที่ VALUES ส่งตาราง Table ของค่าทั้งหมด Microsoft แนะนำให้ใช้ SELECTEDVALUE แทน VALUES ในกรณีส่วนใหญ่ เพราะมีประสิทธิภาพและความปลอดภัยมากขึ้น

VALUES ทำงานกับ Filter Context อย่างไร?

VALUES จะคำนึงถึง Filter Context ที่มีอยู่ หากคุณกำลังดูข้อมูลสำหรับหมวดหมู่เดี่ยว VALUES จะดึงค่าที่ไม่ซ้ำเฉพาะในหมวดหมู่นั้น หากต้องการไม่สนใจ Filter Context ให้ใช้ ALLEXCEPT หรือ ALL

ทำไมใช้ VALUES แล้ว Error "A table of multiple values was supplied"?

เพราะ VALUES คืนค่าเป็นตาราง แต่คุณกำลังพยายามนำไปใช้ในที่ที่ต้องการค่าเดี่ยว (Scalar) วิธีแก้คือใช้ IF(HASONEVALUE(…), VALUES(…)) หรือใช้ SELECTEDVALUE แทน

Resources & Related

Related functions

Additional Notes

VALUES เป็นฟังก์ชันหลักของ DAX ที่ใช้ดึงค่าที่ไม่ซ้ำ (distinct values) จากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง สิ่งที่เจ๋งของ VALUES คือมันสามารถจัดการกับข้อผิดพลาดของความสัมพันธ์ในข้อมูลได้

สำหรับตัวอย่าง หากคุณมีตาราง Sales ที่มีความสัมพันธ์กับตาราง Products แต่มีบางแถวใน Sales ที่อ้างอิงถึง Product ID ที่ไม่มีอยู่จริงใน Products VALUES ก็จะรวมแถว BLANK นี้ไว้ด้วย ในขณะที่ DISTINCT จะละเว้นมันไป

ส่วนตัวผม VALUES มีประโยชน์มากเมื่อคุณทำงานกับข้อมูลที่ไม่สะอาด หรือต้องการนับค่าที่ไม่ซ้ำพร้อมกับการตรวจสอบปัญหาของความสัมพันธ์ข้อมูลด้วย แม้ว่าใน DAX 2019 ขึ้นไป Microsoft แนะนำให้ใช้ DISTINCT เป็นหลักมากขึ้น แต่ VALUES ยังคงเป็นตัวเลือกที่ดีสำหรับกรณีพิเศษ 😎

Leave a Reply

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