DISTINCT คืนค่าตารางที่มีคอลัมน์เดียว ซึ่งประกอบด้วยค่าที่ไม่ซ้ำกันจากคอลัมน์ที่ระบุ โดยไม่รวม Blank Row ที่เกิดจาก Invalid Relationship ความแตกต่างหลักจาก VALUES คือ DISTINCT จะซ่อน Data Quality Issues ในขณะที่ VALUES จะเตือนให้เห็น
=DISTINCT( <column> )
=DISTINCT( <column> )
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| column | column | Yes | คอลัมน์ที่ต้องการดึงค่าที่ไม่ซ้ำ หรือนิพจน์ที่คืนค่าเป็นคอลัมน์ เช่น Sales[ProductID] หรือ RELATED(Products[Category]) |
ใช้สร้างตารางรายการสินค้าที่ไม่ซ้ำ เพื่อนำไปวนลูปคำนวณต่อใน SUMX หรือ AVERAGEX
ใช้ COUNTROWS ครอบ DISTINCT เพื่อจำลองการทำงานของ DISTINCTCOUNT (แต่ DISTINCTCOUNT เร็วกว่า)
Unique Customers = COUNTROWS( DISTINCT( Sales[CustomerID] ) )Unique Customers = COUNTROWS( DISTINCT( Sales[CustomerID] ) )
จำนวนลูกค้าทั่วไป (ตัวอักษร) - หาก Filter Context เลือกเดือนมีนา ก็ได้แค่ลูกค้าในเดือนนั้น
Unique Products = DISTINCT( Sales[ProductCode] )Unique Products = DISTINCT( Sales[ProductCode] )
ตารางชั่วคราวประกอบด้วยรหัสสินค้า (ไม่ซ้ำ) ที่มีการขายจริง
Distinct Count = COUNTROWS( DISTINCT( Sales[ProductID] ) ) Values Count = COUNTROWS( VALUES( Sales[ProductID] ) )Distinct Count = COUNTROWS( DISTINCT( Sales[ProductID] ) )
Values Count = COUNTROWS( VALUES( Sales[ProductID] ) )
DISTINCT: 50 | VALUES: 51 (ทั้ง 50 สินค้า + 1 Blank จากข้อมูลสกปรก)
List of Categories = DISTINCT( Products[Category] )List of Categories = DISTINCT( Products[Category] )
ตารางคงที่สรุปรายการหมวดหมู่สินค้าไม่ซ้ำ (Electronics, Furniture, Clothing ฯลฯ)
โดยทั่วไปแนะนำให้ใช้ VALUES เพราะหากมีความสัมพันธ์ที่ผิดพลาด (เช่น ขายสินค้าที่ไม่มีใน Master) การใช้ VALUES จะทำให้เราเห็น Blank Row ซึ่งช่วยเตือนว่ามีข้อมูลหาย แต่ DISTINCT จะซ่อนปัญหานั้นไว้ ผมเห็นว่า VALUES ปลอดภัยกว่าสำหรับ Data Quality
DISTINCT คืนค่าเป็น **ตาราง** (มี 1 คอลัมน์) ไม่ใช่ตัวเลขตัวเดียว ดังนั้นต้องใช้ COUNTROWS, FILTER, SUMX ร่วมด้วยเสมอ ถ้าพยายามใช้โดยลำพัง จะได้ error ‘Cannot display’ หรือ ได้ค่าแปลกๆ
ใช่แน่นอน ถ้า Report เลือก ‘March 2025’ ผลลัพธ์ของ COUNTROWS(DISTINCT(…)) จะนับแต่ลูกค้าที่ซื้อในเดือนมีนา เพราะ Filter Context กรองข้อมูล Sales ลงมาแล้ว
ไม่ได้ DISTINCT รับได้แค่ 1 อาร์กิวเมนต์เท่านั้น ถ้าต้องการ Unique Combination ให้ใช้ DISTINCT( Sales ) (ตารางทั้งหมด) หรือใช้ GROUPBY กับ SUMMARIZE แทน
DISTINCT คือฟังก์ชันที่ใช้สำหรับดึงรายการข้อมูลที่ไม่ซ้ำกัน (Unique/Distinct Values) ออกมาจากคอลัมน์หรือตารางที่ระบุ โดยจะตัดรายการที่ซ้ำกันออกให้เหลือเพียงรายการเดียว
DISTINCT คืนค่าเป็นตารางชั่วคราว (ไม่ใช่ List) ดังนั้นต้องใช้ COUNTROWS, SUMX, หรือ FILTER ร่วมด้วยเสมอ
ส่วนตัวผมเห็นว่า VALUES และ DISTINCT ทำให้สับสนง่ายมากในชุมชน DAX ที่เป็นจริงคือ:
– **DISTINCT**: “หลีกหนี” Blank Row จาก Invalid Relationship (ข้อมูลสกปรก)
– **VALUES**: “เตือน” เมื่อเจอ Blank Row (ข้อมูลไม่ตรง)
ในทางปฏิบัติ ผมแนะนำให้ใช้ VALUES เพราะมันช่วยดักจับ Data Quality Issues แต่ถ้าข้อมูลสะอาดอยู่แล้ว ผลลัพธ์ของทั้งสองจะเหมือนกัน 😎
**ฟังก์ชันนี้ทำงานใน:**
– Calculated Columns (รับ Row Context)
– Calculated Tables (ดึงตารางชั่วคราว)
– Measures (ไม่มี Row Context ตอนหลัก)
– Visual Calculations (Power BI 2024+)
**คำเตือน:** ผลลัพธ์ของ DISTINCT ไม่ใช่ Additive – รวมค่า Distinct Count ของแต่ละกลุ่มจะไม่เท่ากับ Distinct Count ทั้งหมด