Thep Excel

HASONEVALUEตรวจสอบว่ามีค่าเดียวในบริบท

HASONEVALUE ตรวจสอบว่า Column ที่ผ่านการ Filter มีเพียงค่าเดียวเท่านั้น Return TRUE หากตรงตามเงื่อนไข FALSE หากไม่ใช่ ใช้หลักเพื่อสร้าง Measure ที่ “ฉลาด” ตามการเลือก Filter ของผู้ใช้

fx
=HASONEVALUE(<columnName>)

ความนิยม7/10
ความยาก4/10
ประโยชน์7/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
columnName Column Reference ชื่อของคอลัมน์ที่ต้องการตรวจสอบ ต้องเป็นการอ้างอิงคอลัมน์ที่มีอยู่จริงในตัวแบบข้อมูล ไม่สามารถเป็น Expression หรือการคำนวณแบบเสมือน

Additional Notes

HASONEVALUE(columnName) เป็นฟังก์ชันที่ตรวจสอบว่าในปัจจุบันมีค่าที่แตกต่างกันเพียงค่าเดียวในคอลัมน์ที่ระบุหรือไม่ ทำงานโดยประเมินฟิลเตอร์บริบท (Filter Context) ของคอลัมน์นั้น หากค่าถูกผ่านเข้ามาเพียงค่าเดียวจากการเลือกของผู้ใช้ จะ Return TRUE ถ้ามีมากกว่าหนึ่งค่าหรือไม่มีค่าเลย จะ Return FALSE

ส่วนตัวผมคิดว่า HASONEVALUE เป็นหัวใจสำคัญของการสร้าง Measure ที่ตอบสนองต่อการเลือก Filter ของผู้ใช้ได้อย่างอ่อนไหว ถ้าผู้ใช้เลือก Category เดียว เราอาจแสดงรายละเอียดลึก แต่ถ้าเลือกหลาย Category เราก็แสดงข้อมูลรวมแทน นั่นคือศิลปะของการสร้าง Dashboard ที่ “ฉลาด” 😎

จริงๆ แล้ว HASONEVALUE เทียบเท่ากับ COUNTROWS(VALUES(columnName)) = 1 แต่ HASONEVALUE ชัดเจน เร็วกว่า และอ่านง่ายกว่า ในเวอร์ชัน DAX ใหม่ๆ Microsoft ขอแนะนำให้ใช้ SELECTEDVALUE หากต้องการอ่านค่าที่เลือกด้วย เพราะมันรวมการตรวจสอบและการอ่านค่าไว้ในที่เดียว

How it works

การแสดงข้อความสรุปใน Grand Total

แสดงคำว่า "Total" เมื่ออยู่บนแถว Grand Total (เพราะไม่มีค่าเดียว)

ควบคุมพฤติกรรมการคำนวณ

กำหนดให้ Measure ทำงานแบบหนึ่งเมื่อเลือกค่าเดียว และอีกแบบเมื่อเลือกหลายค่า

Examples

ตัวอย่างที่ 1: ตรวจสอบปีที่เลือกYear Check = IF( HASONEVALUE(Calendar[Year]), "ปีที่เลือก: " & VALUES(Calendar[Year]), "กรุณาเลือกปีเดียว" )

ใช้ IF กับ HASONEVALUE เพื่อสร้างข้อความแบบมีเงื่อนไข ผ่านการเลือก Filter ของผู้ใช้

fx
Year Check =
IF(
HASONEVALUE(Calendar[Year]),
"ปีที่เลือก: " & VALUES(Calendar[Year]),
"กรุณาเลือกปีเดียว"
)

ผลลัพธ์ถ้าเลือกปี 2024 เพียงปีเดียว จะแสดง "ปีที่เลือก: 2024" ถ้าเลือกหลายปีหรือไม่เลือก จะแสดง "กรุณาเลือกปีเดียว"
ตัวอย่างที่ 2: เปอร์เซ็นต์เทียบกับปีฐานYoY Percentage = IF( HASONEVALUE(Calendar[Year]), DIVIDE( SUM(Sales[Amount]), CALCULATE( SUM(Sales[Amount]), Calendar[Year] = 2023 ) ), BLANK() )

กรณีการใช้งานที่สำคัญคือ การคำนวณ Year-over-Year (YoY) ควรแสดงเฉพาะเมื่อผู้ใช้เลือกปีเดียว เพราะเมื่อเลือกหลายปี การเทียบกับปีฐานจะไม่มีความสำคัญและสร้างความสับสน

fx
YoY Percentage =
IF(
HASONEVALUE(Calendar[Year]),
DIVIDE(
SUM(Sales[Amount]),
CALCULATE(
SUM(Sales[Amount]),
Calendar[Year] = 2023
)
),
BLANK()
)

ผลลัพธ์เมื่อเลือกปีเดียว (เช่น 2024) จะแสดงเปอร์เซ็นต์เทียบกับปี 2023 เมื่อเลือกหลายปี จะแสดง BLANK (ว่างเปล่า)
ตัวอย่างที่ 3: สลับระหว่างรายละเอียดกับรวมSmart Detail Level = IF( HASONEVALUE(Products[Category]), "เลือก: " & VALUES(Products[Category]) & " – " & SUM(Sales[Quantity]) & " หน่วย", "รวม " & DISTINCTCOU…

ประโยชน์สำคัญของ HASONEVALUE คือสามารถสลับระหว่างแสดงรายละเอียดสำหรับรายการเดียวและแสดงข้อมูลรวมสำหรับหลายรายการ ทำให้ Dashboard มีความยืดหยุ่น

fx
Smart Detail Level =
IF(
HASONEVALUE(Products[Category]),
"เลือก: " & VALUES(Products[Category]) & " – " & SUM(Sales[Quantity]) & " หน่วย",
"รวม " & DISTINCTCOUNT(Products[Category]) & " หมวดหมู่"
)

ผลลัพธ์หากเลือก Category "Electronics" จะแสดง "เลือก: Electronics – 5000 หน่วย" หากเลือกหลาย Category จะแสดง "รวม 3 หมวดหมู่"
ตัวอย่างที่ 4: ป้องกันการหารที่ไม่ถูกต้องDaily Average per Store = IF( HASONEVALUE(Stores[StoreID]), DIVIDE( SUM(Sales[Amount]), COUNTROWS(VALUES(Dates[Date])), 0 ), BLANK() )

ในกรณีเลือกหลายสาขา หากเราหารยอดขายรวมด้วยจำนวนวัน ผลลัพธ์จะผิดเพราะแต่ละสาขามีจำนวนวันเท่า จึงควรแสดง BLANK() เพื่อป้องกันการตีความที่ผิด

fx
Daily Average per Store =
IF(
HASONEVALUE(Stores[StoreID]),
DIVIDE(
SUM(Sales[Amount]),
COUNTROWS(VALUES(Dates[Date])),
0
),
BLANK()
)

ผลลัพธ์ถ้าเลือกสาขาเดียว จะแสดงยอดขายเฉลี่ยต่อวัน ถ้าเลือกหลายสาขา จะแสดง BLANK เพื่อป้องกันข้อมูลที่ผิดพลาด

FAQs

HASONEVALUE ต่างจาก SELECTEDVALUE ยังไง?+

HASONEVALUE เพียงตรวจสอบว่ามีค่าเดียวหรือไม่ (Return TRUE/FALSE) ส่วน SELECTEDVALUE นอกจากตรวจสอบแล้ว ยังจะ Return ค่านั้นด้วย หรือ Return ค่า Default หากไม่มีค่าเดียว SELECTEDVALUE ใหม่กว่าและสะดวกกว่า แต่ HASONEVALUE ยังคงมีประโยชน์เมื่อต้องการตรวจสอบเท่านั้น

ใช้ HASONEVALUE กับ Calculated Column ได้ไหม?+

ได้ทางเทคนิค แต่ Calculated Column มีแต่ Row Context ไม่มี Filter Context เหมือน Measure ดังนั้นถ้าใช้ HASONEVALUE ใน Calculated Column มักจะ Return FALSE ตลอด เนื่องจากค่าทั้งหมดในคอลัมน์พิจารณาว่าผ่านมาทีละแถว ส่วนใหญ่ HASONEVALUE ใช้ใน Measure เพื่อตรวจสอบการเลือก Filter ของผู้ใช้

ถ้าไม่มีการ Filter Column เลย HASONEVALUE จะ Return อะไร?+

จะ Return FALSE เพราะในกรณีนั้น Column จะมีค่าหลายค่า (ทั้งหมดที่มีในตัวแบบข้อมูล) HASONEVALUE ตรวจสอบจำนวนค่าที่แตกต่างกัน ไม่ใช่จำนวนแถว

มี Expression ที่เทียบเท่า HASONEVALUE หรือไม่?+

ใช่ COUNTROWS(VALUES(columnName)) = 1 ให้ผลลัพธ์เดียวกันอย่างสมบูรณ์ แต่ HASONEVALUE ชัดเจนและเร็วกว่า เนื่องจากเป็นฟังก์ชันที่ออกแบบมาโดยเฉพาะสำหรับวัตถุประสงค์นี้

ใช้ HASONEVALUE กับหลายคอลัมน์พร้อมกันได้ไหม?+

ไม่ได้ โดยตรง HASONEVALUE รับเพียงคอลัมน์เดียว แต่สามารถใช้หลายครั้งในตัววัด เช่น IF(HASONEVALUE(Products[Category]) AND HASONEVALUE(Calendar[Year]), …) เพื่อตรวจสอบหลายคอลัมน์

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ HASONEVALUE จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้HASONEVALUEInformation
Filter (2)
CALCULATE

CALCULATE เป็นฟังก์ชันหลักที่สำคัญที่สุดใน DAX ใช้สำหรับ evaluate expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน สามารถเพิ่มตัวกรองใหม่ ลบตัวกรองเดิม หรือแทนที่ filter ที่มีอยู่ได้ รองรับทั้ง Boolean expression และ table expression เป็น filter arguments พร้อม filter modifier functions เช่น REMOVEFILTERS, ALL, ALLEXCEPT, KEEPFILTERS เพื่อควบคุมการกรองอย่างละเอียด มีพฤติกรรมพิเศษคือ context transition ที่เปลี่ยน row context เป็น filter context โดยอัตโนมัติ ทำให้เป็นเครื่องมือหลักในการสร้าง measure ที่ซับซ้อนและ calculated column ที่ต้องใช้ aggregation

SELECTEDVALUE

SELECTEDVALUE ตรวจสอบว่า Filter Context ลดลงเหลือเพียงค่าเดียวแล้ว ถ้าใช่ให้คืนค่านั้น ถ้าไม่ใช่ให้คืนค่าอื่นแทน

Aggregation (2)
COUNTROWS

COUNTROWS เป็นฟังก์ชันการรวม (Aggregation) ที่นับจำนวนแถวในตารางที่ระบุ ไม่ว่าจะเป็นตารางจริงในโมเดลหรือตารางเสมือน (Virtual Table) จากฟังก์ชันอื่นๆ เช่น FILTER, VALUES, DISTINCT นับเท่าไหร่? ผลลัพธ์ก็คือจำนวนแถวเต็ม ๆ

DISTINCTCOUNT

DISTINCTCOUNT นับจำนวนค่าที่แตกต่างกันทั้งหมดในคอลัมน์ รวมถึง BLANK values ถ้าไม่มีแถวข้อมูล จะคืนค่า BLANK

Table manipulation (2)
FILTERS

FILTERS คืนค่าเป็นตาราง (table) ของค่าที่ถูกกรองโดยตรง (direct filters) บนคอลัมน์ที่ระบุ เช่น ค่าที่ผู้ใช้เลือกจากตัวแบ่งส่วนข้อมูล ต่างจาก ALL/ALLEXCEPT ที่เคลียร์ตัวกรอง FILTERS ช่วยตรวจสอบและจัดการบริบทตัวกรองอย่างชาญฉลาด

VALUES

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

Information (2)
HASONEFILTER

ตรวจว่าคอลัมน์ถูก filter โดยตรงให้เหลือค่าเดียวหรือไม่ เหมาะกับการควบคุมการแสดงผลตามสถานะการเลือกของผู้ใช้

ISFILTERED

ISFILTERED ตรวจสอบว่าคอลัมน์ที่ระบุมีตัวกรองโดยตรงหรือไม่ ใช้เพื่อสร้าง Dynamic Measures ที่เปลี่ยนพฤติกรรมตามการกรองของผู้ใช้

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่