HASONEVALUE ตรวจสอบว่า Column ที่ผ่านการ Filter มีเพียงค่าเดียวเท่านั้น Return TRUE หากตรงตามเงื่อนไข FALSE หากไม่ใช่ ใช้หลักเพื่อสร้าง Measure ที่ “ฉลาด” ตามการเลือก Filter ของผู้ใช้
=HASONEVALUE(<columnName>)
=HASONEVALUE(<columnName>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| columnName | Column Reference | Yes | ชื่อของคอลัมน์ที่ต้องการตรวจสอบ ต้องเป็นการอ้างอิงคอลัมน์ที่มีอยู่จริงในตัวแบบข้อมูล ไม่สามารถเป็น Expression หรือการคำนวณแบบเสมือน |
แสดงคำว่า "Total" เมื่ออยู่บนแถว Grand Total (เพราะไม่มีค่าเดียว)
กำหนดให้ Measure ทำงานแบบหนึ่งเมื่อเลือกค่าเดียว และอีกแบบเมื่อเลือกหลายค่า
Year Check = IF( HASONEVALUE(Calendar[Year]), "ปีที่เลือก: " & VALUES(Calendar[Year]), "กรุณาเลือกปีเดียว" )Year Check =
IF(
HASONEVALUE(Calendar[Year]),
"ปีที่เลือก: " & VALUES(Calendar[Year]),
"กรุณาเลือกปีเดียว"
)
ถ้าเลือกปี 2024 เพียงปีเดียว จะแสดง "ปีที่เลือก: 2024" ถ้าเลือกหลายปีหรือไม่เลือก จะแสดง "กรุณาเลือกปีเดียว"
YoY Percentage = IF( HASONEVALUE(Calendar[Year]), DIVIDE( SUM(Sales[Amount]), CALCULATE( SUM(Sales[Amount]), Calendar[Year] = 2023 ) ), BLANK() )YoY Percentage =
IF(
HASONEVALUE(Calendar[Year]),
DIVIDE(
SUM(Sales[Amount]),
CALCULATE(
SUM(Sales[Amount]),
Calendar[Year] = 2023
)
),
BLANK()
)
เมื่อเลือกปีเดียว (เช่น 2024) จะแสดงเปอร์เซ็นต์เทียบกับปี 2023 เมื่อเลือกหลายปี จะแสดง BLANK (ว่างเปล่า)
Smart Detail Level = IF( HASONEVALUE(Products[Category]), "เลือก: " & VALUES(Products[Category]) & " - " & SUM(Sales[Quantity]) & " หน่วย", "รวม " & DISTINCTCOU…Smart Detail Level =
IF(
HASONEVALUE(Products[Category]),
"เลือก: " & VALUES(Products[Category]) & " - " & SUM(Sales[Quantity]) & " หน่วย",
"รวม " & DISTINCTCOUNT(Products[Category]) & " หมวดหมู่"
)
หากเลือก Category "Electronics" จะแสดง "เลือก: Electronics - 5000 หน่วย" หากเลือกหลาย Category จะแสดง "รวม 3 หมวดหมู่"
Daily Average per Store = IF( HASONEVALUE(Stores[StoreID]), DIVIDE( SUM(Sales[Amount]), COUNTROWS(VALUES(Dates[Date])), 0 ), BLANK() )Daily Average per Store =
IF(
HASONEVALUE(Stores[StoreID]),
DIVIDE(
SUM(Sales[Amount]),
COUNTROWS(VALUES(Dates[Date])),
0
),
BLANK()
)
ถ้าเลือกสาขาเดียว จะแสดงยอดขายเฉลี่ยต่อวัน ถ้าเลือกหลายสาขา จะแสดง BLANK เพื่อป้องกันข้อมูลที่ผิดพลาด
HASONEVALUE เพียงตรวจสอบว่ามีค่าเดียวหรือไม่ (Return TRUE/FALSE) ส่วน SELECTEDVALUE นอกจากตรวจสอบแล้ว ยังจะ Return ค่านั้นด้วย หรือ Return ค่า Default หากไม่มีค่าเดียว SELECTEDVALUE ใหม่กว่าและสะดวกกว่า แต่ HASONEVALUE ยังคงมีประโยชน์เมื่อต้องการตรวจสอบเท่านั้น
ได้ทางเทคนิค แต่ Calculated Column มีแต่ Row Context ไม่มี Filter Context เหมือน Measure ดังนั้นถ้าใช้ HASONEVALUE ใน Calculated Column มักจะ Return FALSE ตลอด เนื่องจากค่าทั้งหมดในคอลัมน์พิจารณาว่าผ่านมาทีละแถว ส่วนใหญ่ HASONEVALUE ใช้ใน Measure เพื่อตรวจสอบการเลือก Filter ของผู้ใช้
จะ Return FALSE เพราะในกรณีนั้น Column จะมีค่าหลายค่า (ทั้งหมดที่มีในตัวแบบข้อมูล) HASONEVALUE ตรวจสอบจำนวนค่าที่แตกต่างกัน ไม่ใช่จำนวนแถว
ใช่ COUNTROWS(VALUES(columnName)) = 1 ให้ผลลัพธ์เดียวกันอย่างสมบูรณ์ แต่ HASONEVALUE ชัดเจนและเร็วกว่า เนื่องจากเป็นฟังก์ชันที่ออกแบบมาโดยเฉพาะสำหรับวัตถุประสงค์นี้
ไม่ได้ โดยตรง HASONEVALUE รับเพียงคอลัมน์เดียว แต่สามารถใช้หลายครั้งในตัววัด เช่น IF(HASONEVALUE(Products[Category]) AND HASONEVALUE(Calendar[Year]), …) เพื่อตรวจสอบหลายคอลัมน์
HASONEVALUE(columnName) เป็นฟังก์ชันที่ตรวจสอบว่าในปัจจุบันมีค่าที่แตกต่างกันเพียงค่าเดียวในคอลัมน์ที่ระบุหรือไม่ ทำงานโดยประเมินฟิลเตอร์บริบท (Filter Context) ของคอลัมน์นั้น หากค่าถูกผ่านเข้ามาเพียงค่าเดียวจากการเลือกของผู้ใช้ จะ Return TRUE ถ้ามีมากกว่าหนึ่งค่าหรือไม่มีค่าเลย จะ Return FALSE
ส่วนตัวผมคิดว่า HASONEVALUE เป็นหัวใจสำคัญของการสร้าง Measure ที่ตอบสนองต่อการเลือก Filter ของผู้ใช้ได้อย่างอ่อนไหว ถ้าผู้ใช้เลือก Category เดียว เราอาจแสดงรายละเอียดลึก แต่ถ้าเลือกหลาย Category เราก็แสดงข้อมูลรวมแทน นั่นคือศิลปะของการสร้าง Dashboard ที่ “ฉลาด” 😎
จริงๆ แล้ว HASONEVALUE เทียบเท่ากับ COUNTROWS(VALUES(columnName)) = 1 แต่ HASONEVALUE ชัดเจน เร็วกว่า และอ่านง่ายกว่า ในเวอร์ชัน DAX ใหม่ๆ Microsoft ขอแนะนำให้ใช้ SELECTEDVALUE หากต้องการอ่านค่าที่เลือกด้วย เพราะมันรวมการตรวจสอบและการอ่านค่าไว้ในที่เดียว