Thep Excel

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

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

fx
=HASONEFILTER(<columnName>)

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

อัปเดต 14 December 2025

Syntax & Arguments

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

Additional Notes

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

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

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

How it works

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

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

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

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

Examples

ตัวอย่างที่ 1: แสดงยอดขายเมื่อเลือกหมวดสินค้าเดียวSales by Category = IF( HASONEFILTER('Product'[Category]), SUM('Sales'[Amount]), BLANK() )

ใช้ IF กับ HASONEFILTER เพื่อควบคุมการแสดงผล เมื่อผู้ใช้เลือกค่าเดียว measure จึงคำนวณ ไม่เช่นนั้นแสดง BLANK()

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

ผลลัพธ์ถ้าเลือก Category เดียว (จาก slicer) = แสดงยอดขาย; ถ้าไม่เลือก/เลือกหลายค่า = ว่าง
ตัวอย่างที่ 2: แสดงชื่อผลิตภัณฑ์ที่เลือกProduct Name Display = IF( HASONEFILTER('Product'[ProductKey]), SELECTEDVALUE('Product'[ProductName]), "Select one product" )

รวม HASONEFILTER กับ SELECTEDVALUE เพื่อดึงค่าที่เลือกออกมาใช้ เหมาะกับการแสดง breadcrumb หรือ title บนรายงาน

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

ผลลัพธ์ถ้า filter Product เดียว = แสดงชื่อ; ไม่เช่นนั้น = ข้อความแนะนำ
ตัวอย่างที่ 3: เปรียบเทียบ HASONEFILTER กับ HASONEVALUECompare Result = VAR HasDirectFilter = HASONEFILTER('Customer'[Region]) VAR HasOneValueLeft = HASONEVALUE('Customer'[Region]) RETURN IF( AND(HasDirectFilter, Ha…

HASONEFILTER ตรวจ direct filter เท่านั้น; HASONEVALUE ตรวจว่าบริบทเหลือค่าเดียวไม่ว่ามาจากไหน ถ้า filter มาจาก relationship ให้ผลต่างกัน

fx
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"
)
)

ผลลัพธ์ใช้ VAR เก็บผลลัพธ์เพื่อเปรียบเทียบและ debug
ตัวอย่างที่ 4: Subtitle ที่เปลี่ยนตามการเลือกDynamic Subtitle = IF( HASONEFILTER('Product'[Category]), "Sales for: " & SELECTEDVALUE('Product'[Category]), "Select a category to view details" )

รวมข้อความ + SELECTEDVALUE ได้ข้อมูลชัดเจนว่าผู้ใช้เลือกค่าไหน ส่วนตัวผมชอบใช้กับ Card visual เพื่อแสดงบริบทของรายงาน

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

ผลลัพธ์ส่วนหัวข้อรอง (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

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

ฟังก์ชันนี้HASONEFILTERInformation
Filter (3)
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

FILTER

FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน

SELECTEDVALUE

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

Information (3)
EVALUATEANDLOG

EVALUATEANDLOG คำนวณนิพจน์และส่งผลลัพธ์ไปยัง log สำหรับการตรวจสอบและดีบัก ทำให้เห็นค่าระหว่างกลางของการคำนวณ DAX โดยไม่ต้องเขียนตารางชั่วคราว

HASONEVALUE

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

ISFILTERED

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

Table manipulation (2)
FILTERS

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

VALUES

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

Comments

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