Thep Excel

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

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

=HASONEVALUE(<columnName>)

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
7/10

Difficulty
4/10

Usefulness
7/10

Syntax & Arguments

=HASONEVALUE(<columnName>)

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

How it works

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

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

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

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

Examples

ตัวอย่างที่ 1: ตรวจสอบปีที่เลือก
Year Check = IF( HASONEVALUE(Calendar[Year]), "ปีที่เลือก: " & VALUES(Calendar[Year]), "กรุณาเลือกปีเดียว" )
ใช้ IF กับ HASONEVALUE เพื่อสร้างข้อความแบบมีเงื่อนไข ผ่านการเลือก Filter ของผู้ใช้
DAX Formula:

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

Result:

ถ้าเลือกปี 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) ควรแสดงเฉพาะเมื่อผู้ใช้เลือกปีเดียว เพราะเมื่อเลือกหลายปี การเทียบกับปีฐานจะไม่มีความสำคัญและสร้างความสับสน
DAX Formula:

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

Result:

เมื่อเลือกปีเดียว (เช่น 2024) จะแสดงเปอร์เซ็นต์เทียบกับปี 2023 เมื่อเลือกหลายปี จะแสดง BLANK (ว่างเปล่า)

ตัวอย่างที่ 3: สลับระหว่างรายละเอียดกับรวม
Smart Detail Level = IF( HASONEVALUE(Products[Category]), "เลือก: " & VALUES(Products[Category]) & " - " & SUM(Sales[Quantity]) & " หน่วย", "รวม " & DISTINCTCOU…
ประโยชน์สำคัญของ HASONEVALUE คือสามารถสลับระหว่างแสดงรายละเอียดสำหรับรายการเดียวและแสดงข้อมูลรวมสำหรับหลายรายการ ทำให้ Dashboard มีความยืดหยุ่น
DAX Formula:

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

Result:

หากเลือก 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() เพื่อป้องกันการตีความที่ผิด
DAX Formula:

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

Result:

ถ้าเลือกสาขาเดียว จะแสดงยอดขายเฉลี่ยต่อวัน ถ้าเลือกหลายสาขา จะแสดง 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

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 หากต้องการอ่านค่าที่เลือกด้วย เพราะมันรวมการตรวจสอบและการอ่านค่าไว้ในที่เดียว

Leave a Reply

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