ตรวจว่าคอลัมน์ถูก filter โดยตรงให้เหลือค่าเดียวหรือไม่ เหมาะกับการควบคุมการแสดงผลตามสถานะการเลือกของผู้ใช้
=HASONEFILTER(<columnName>)
=HASONEFILTER(<columnName>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| columnName | column | Yes | คอลัมน์ที่ต้องการตรวจว่าถูกจำกัดด้วย direct filter ให้เหลือค่าเดียวหรือไม่ ต้องระบุชื่อเต็มของคอลัมน์ (ไม่สามารถใช้ expression) |
เช่น การ์ดที่ต้องการแสดงยอดของหมวดเดียวเท่านั้น ถ้าเลือกหลายหมวดให้แสดงค่าว่าง
เช่น เปลี่ยนข้อความ/ตัวชี้วัดเมื่อผู้ใช้เลือกค่าเดียว vs เลือกหลายค่า
Sales by Category = IF( HASONEFILTER('Product'[Category]), SUM('Sales'[Amount]), BLANK() )Sales by Category =
IF(
HASONEFILTER('Product'[Category]),
SUM('Sales'[Amount]),
BLANK()
)
ถ้าเลือก Category เดียว (จาก slicer) = แสดงยอดขาย; ถ้าไม่เลือก/เลือกหลายค่า = ว่าง
Product Name Display = IF( HASONEFILTER('Product'[ProductKey]), SELECTEDVALUE('Product'[ProductName]), "Select one product" )Product Name Display =
IF(
HASONEFILTER('Product'[ProductKey]),
SELECTEDVALUE('Product'[ProductName]),
"Select one product"
)
ถ้า filter Product เดียว = แสดงชื่อ; ไม่เช่นนั้น = ข้อความแนะนำ
Compare Result = VAR HasDirectFilter = HASONEFILTER('Customer'[Region]) VAR HasOneValueLeft = HASONEVALUE('Customer'[Region]) RETURN IF( AND(HasDirectFilter, Ha…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
Dynamic Subtitle = IF( HASONEFILTER('Product'[Category]), "Sales for: " & SELECTEDVALUE('Product'[Category]), "Select a category to view details" )Dynamic Subtitle =
IF(
HASONEFILTER('Product'[Category]),
"Sales for: " & SELECTEDVALUE('Product'[Category]),
"Select a category to view details"
)
ส่วนหัวข้อรอง (subtitle) บนรายงานที่บอกว่าเลือกหมวดไหน
HASONEFILTER ตรวจเฉพาะ direct filter (filter ที่ผู้ใช้เลือกจาก slicer/เน้นโดยตรง) ส่วน HASONEVALUE ตรวจจำนวนค่าที่เหลือในบริบท ซึ่งอาจได้รับผลจากความสัมพันธ์หรือ filter อื่น ตัวอย่าง: ถ้า filter Product ไปแล้วทำให้ Category เหลือค่าเดียว HASONEVALUE(Category) = TRUE แต่ HASONEFILTER(Category) = FALSE เพราะไม่มีการ filter Category โดยตรง
HASONEFILTER คืน FALSE ในสองกรณี: (1) ไม่มี filter ที่คอลัมน์นั้นเลย (2) มี filter มากกว่าหนึ่งค่า ถ้าเลือกค่าหลายค่าจาก slicer ของคอลัมน์นั้น มันจะคืน FALSE ทันที
ใช้ SELECTEDVALUE() ที่คืนค่าเดียวถ้าบริบทเหลือค่าเดียว หรือ VALUES() ที่คืนตาราง ผมมักเช็ค HASONEFILTER ก่อนจึงใช้ SELECTEDVALUE ตามด้วย เพื่อมั่นใจว่าได้ค่าจริง
สามารถใช้ใน Calculated Column, Calculated Table, Measure, Visual Calculation ได้หมด แต่ DirectQuery mode ไม่รองรับใน Calculated Column และ RLS
ใช้ AND/OR รวม HASONEFILTER หลายตัว เช่น AND(HASONEFILTER(Col1), HASONEFILTER(Col2)) ส่วนตัวผมมักไปที่ HASONEVALUE กับ AND เพื่อชัวร์ว่าบริบทเหลือค่าเดียวทั้งหมด
HASONEFILTER คืนค่า TRUE เมื่อคอลัมน์ที่ระบุถูก filter โดยตรง (direct filter) ให้เหลือค่าเดียว ไม่ใช่การ filter ทางอ้อมผ่านความสัมพันธ์
ที่เจ๋งคือ HASONEFILTER ตรวจเฉพาะการจำกัดโดยตรงที่คอลัมน์นั้น ถ้าคอลัมน์ถูก filter ผ่านทางความสัมพันธ์ (cross-filter) มันจะคืนค่า FALSE แม้ว่าจริงๆ บริบทเหลือค่าเดียว นี่คือความแตกต่างสำคัญจาก HASONEVALUE ที่ตรวจจำนวนค่าสุดท้ายไม่ว่ามาจากไหน
ส่วนตัวผมมักใช้ HASONEFILTER เมื่อต้องการควบคุมการแสดงผลตามว่า “ผู้ใช้เลือกค่าเดียวจาก slicer นี้หรือไม่” ถ้าจำนวนค่าลดลงด้วยเหตุสาเหตุอื่น (เช่น filter หลายคอลัมน์) มันไม่สนใจ มันแค่เน้น “ผู้ใช้กดเลือกบนคอลัมน์นี้หรือไม่” เท่านั้น ครับ