Thep Excel

HASONEFILTER – ตรวจสอบว่าคอลัมน์ถูกจำกัดค่าเดียวโดยตรง

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

=HASONEFILTER(<columnName>)

By ThepExcel AI Agent
14 December 2025

Function Metrics


Popularity
5/10

Difficulty
4/10

Usefulness
5/10

Syntax & Arguments

=HASONEFILTER(<columnName>)

Argument Type Required Default Description
columnName column Yes คอลัมน์ที่ต้องการตรวจว่าถูกจำกัดด้วย direct filter ให้เหลือค่าเดียวหรือไม่ ต้องระบุชื่อเต็มของคอลัมน์ (ไม่สามารถใช้ expression)

How it works

แสดงค่าเฉพาะเมื่อเลือกค่าเดียว

เช่น การ์ดที่ต้องการแสดงยอดของหมวดเดียวเท่านั้น ถ้าเลือกหลายหมวดให้แสดงค่าว่าง

ทำตรรกะการคำนวณที่ขึ้นกับการเลือก

เช่น เปลี่ยนข้อความ/ตัวชี้วัดเมื่อผู้ใช้เลือกค่าเดียว vs เลือกหลายค่า

Examples

ตัวอย่างที่ 1: แสดงยอดขายเมื่อเลือกหมวดสินค้าเดียว
Sales by Category = IF( HASONEFILTER('Product'[Category]), SUM('Sales'[Amount]), BLANK() )
ใช้ IF กับ HASONEFILTER เพื่อควบคุมการแสดงผล เมื่อผู้ใช้เลือกค่าเดียว measure จึงคำนวณ ไม่เช่นนั้นแสดง BLANK()
DAX Formula:

Sales by Category =
IF(
    HASONEFILTER('Product'[Category]),
    SUM('Sales'[Amount]),
    BLANK()
)

Result:

ถ้าเลือก Category เดียว (จาก slicer) = แสดงยอดขาย; ถ้าไม่เลือก/เลือกหลายค่า = ว่าง

ตัวอย่างที่ 2: แสดงชื่อผลิตภัณฑ์ที่เลือก
Product Name Display = IF( HASONEFILTER('Product'[ProductKey]), SELECTEDVALUE('Product'[ProductName]), "Select one product" )
รวม HASONEFILTER กับ SELECTEDVALUE เพื่อดึงค่าที่เลือกออกมาใช้ เหมาะกับการแสดง breadcrumb หรือ title บนรายงาน
DAX Formula:

Product Name Display =
IF(
    HASONEFILTER('Product'[ProductKey]),
    SELECTEDVALUE('Product'[ProductName]),
    "Select one product"
)

Result:

ถ้า filter Product เดียว = แสดงชื่อ; ไม่เช่นนั้น = ข้อความแนะนำ

ตัวอย่างที่ 3: เปรียบเทียบ HASONEFILTER กับ HASONEVALUE
Compare Result = VAR HasDirectFilter = HASONEFILTER('Customer'[Region]) VAR HasOneValueLeft = HASONEVALUE('Customer'[Region]) RETURN IF( AND(HasDirectFilter, Ha…
HASONEFILTER ตรวจ direct filter เท่านั้น; HASONEVALUE ตรวจว่าบริบทเหลือค่าเดียวไม่ว่ามาจากไหน ถ้า filter มาจาก relationship ให้ผลต่างกัน
DAX Formula:

Compare Result =
VAR HasDirectFilter = HASONEFILTER('Customer'[Region])
VAR HasOneValueLeft = HASONEVALUE('Customer'[Region])
RETURN
IF(
    AND(HasDirectFilter, HasOneValueLeft),
    "Both TRUE - Direct filter + context has one value",
    IF(
        HasDirectFilter,
        "Only HASONEFILTER TRUE - Direct filter exists",
        "Both FALSE - No direct filter"
    )
)

Result:

ใช้ VAR เก็บผลลัพธ์เพื่อเปรียบเทียบและ debug

ตัวอย่างที่ 4: Subtitle ที่เปลี่ยนตามการเลือก
Dynamic Subtitle = IF( HASONEFILTER('Product'[Category]), "Sales for: " & SELECTEDVALUE('Product'[Category]), "Select a category to view details" )
รวมข้อความ + SELECTEDVALUE ได้ข้อมูลชัดเจนว่าผู้ใช้เลือกค่าไหน ส่วนตัวผมชอบใช้กับ Card visual เพื่อแสดงบริบทของรายงาน
DAX Formula:

Dynamic Subtitle =
IF(
    HASONEFILTER('Product'[Category]),
    "Sales for: " & SELECTEDVALUE('Product'[Category]),
    "Select a category to view details"
)

Result:

ส่วนหัวข้อรอง (subtitle) บนรายงานที่บอกว่าเลือกหมวดไหน

FAQs

HASONEFILTER ต่างจาก HASONEVALUE อย่างไร?

HASONEFILTER ตรวจเฉพาะ direct filter (filter ที่ผู้ใช้เลือกจาก slicer/เน้นโดยตรง) ส่วน HASONEVALUE ตรวจจำนวนค่าที่เหลือในบริบท ซึ่งอาจได้รับผลจากความสัมพันธ์หรือ filter อื่น ตัวอย่าง: ถ้า filter Product ไปแล้วทำให้ Category เหลือค่าเดียว HASONEVALUE(Category) = TRUE แต่ HASONEFILTER(Category) = FALSE เพราะไม่มีการ filter Category โดยตรง

เมื่อไหร่ที่ HASONEFILTER จะคืนค่า FALSE?

HASONEFILTER คืน FALSE ในสองกรณี: (1) ไม่มี filter ที่คอลัมน์นั้นเลย (2) มี filter มากกว่าหนึ่งค่า ถ้าเลือกค่าหลายค่าจาก slicer ของคอลัมน์นั้น มันจะคืน FALSE ทันที

ถ้าต้องการดึงค่าที่เลือกออกมา ควรใช้ฟังก์ชันไหน?

ใช้ SELECTEDVALUE() ที่คืนค่าเดียวถ้าบริบทเหลือค่าเดียว หรือ VALUES() ที่คืนตาราง ผมมักเช็ค HASONEFILTER ก่อนจึงใช้ SELECTEDVALUE ตามด้วย เพื่อมั่นใจว่าได้ค่าจริง

ใช้ HASONEFILTER ได้ในทุกที่หรือมีข้อจำกัด?

สามารถใช้ใน Calculated Column, Calculated Table, Measure, Visual Calculation ได้หมด แต่ DirectQuery mode ไม่รองรับใน Calculated Column และ RLS

ถ้าต้องเช็คหลายคอลัมน์พร้อมกันล่ะ?

ใช้ AND/OR รวม HASONEFILTER หลายตัว เช่น AND(HASONEFILTER(Col1), HASONEFILTER(Col2)) ส่วนตัวผมมักไปที่ HASONEVALUE กับ AND เพื่อชัวร์ว่าบริบทเหลือค่าเดียวทั้งหมด

Resources & Related

Additional Notes

HASONEFILTER คืนค่า TRUE เมื่อคอลัมน์ที่ระบุถูก filter โดยตรง (direct filter) ให้เหลือค่าเดียว ไม่ใช่การ filter ทางอ้อมผ่านความสัมพันธ์

ที่เจ๋งคือ HASONEFILTER ตรวจเฉพาะการจำกัดโดยตรงที่คอลัมน์นั้น ถ้าคอลัมน์ถูก filter ผ่านทางความสัมพันธ์ (cross-filter) มันจะคืนค่า FALSE แม้ว่าจริงๆ บริบทเหลือค่าเดียว นี่คือความแตกต่างสำคัญจาก HASONEVALUE ที่ตรวจจำนวนค่าสุดท้ายไม่ว่ามาจากไหน

ส่วนตัวผมมักใช้ HASONEFILTER เมื่อต้องการควบคุมการแสดงผลตามว่า “ผู้ใช้เลือกค่าเดียวจาก slicer นี้หรือไม่” ถ้าจำนวนค่าลดลงด้วยเหตุสาเหตุอื่น (เช่น filter หลายคอลัมน์) มันไม่สนใจ มันแค่เน้น “ผู้ใช้กดเลือกบนคอลัมน์นี้หรือไม่” เท่านั้น ครับ

Leave a Reply

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