---
title: HASONEFILTER – ตรวจสอบว่าคอลัมน์ถูกจำกัดค่าเดียวโดยตรง
url: https://www.thepexcel.com/functions/dax/information/hasonefilter-dax/
type: function-explainer
program: DAX
syntax: "HASONEFILTER(<columnName>)"
date: 2025-12-14
updated: 2025-12-25
scores:
  popularity: 5
  difficulty: 4
  usefulness: 5
---

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

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

## คำอธิบาย

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

## Syntax

```excel
HASONEFILTER(&lt;columnName&gt;)
```

## Arguments

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

## เคสการใช้งาน

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

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

_เหมาะกับ:_ single-selection-required

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

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

_เหมาะกับ:_ selection-dependent-logic

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: แสดงยอดขายเมื่อเลือกหมวดสินค้าเดียว

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

**ผลลัพธ์:** `ถ้าเลือก Category เดียว (จาก slicer) = แสดงยอดขาย; ถ้าไม่เลือก/เลือกหลายค่า = ว่าง`

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

### 2. ตัวอย่างที่ 2: แสดงชื่อผลิตภัณฑ์ที่เลือก

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

**ผลลัพธ์:** `ถ้า filter Product เดียว = แสดงชื่อ; ไม่เช่นนั้น = ข้อความแนะนำ`

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

### 3. ตัวอย่างที่ 3: เปรียบเทียบ HASONEFILTER กับ HASONEVALUE

```excel
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`

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

### 4. ตัวอย่างที่ 4: Subtitle ที่เปลี่ยนตามการเลือก

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

**ผลลัพธ์:** `ส่วนหัวข้อรอง (subtitle) บนรายงานที่บอกว่าเลือกหมวดไหน`

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

## หมายเหตุเพิ่มเติม

- ผมแนะนำให้เริ่มจาก HASONEFILTER ถ้าคำถามคือ "ผู้ใช้เลือกค่าเดียวจาก slicer นี้หรือไม่" ถ้าคำถามคือ "บริบทเหลือค่าเดียวไม่ว่ามาจากไหน" ค่อยไปหา HASONEVALUE

- ใช้คู่กับ IF/BLANK เพื่อควบคุมการแสดงผล ก็ได้ measure ที่ smart มากขึ้น แสดงเฉพาะเมื่อข้อมูลสมบูรณ์ ไม่เช่นนั้นเว้นว่าง

- ส่วนตัวผม มักใช้เพื่อแสดง subtitle หรือ context ให้ชัดเจนว่าผู้ใช้เลือกอะไร อย่างเช่น "Sales for Category: [ชื่อ]" ได้ผลสุดท้ายที่เข้าใจง่าย

- ระวัง filter ทางอ้อม: ถ้า filter มาจากความสัมพันธ์หรือ CALCULATE ขั้นสูง HASONEFILTER อาจให้ผลลัพธ์ไม่ตรงคาด เสมอเช็ค HASONEVALUE ด้วยกัน

- ผมไม่แนะนำใช้ใน Row-level Security (RLS) เพราะมีข้อจำกัดใน DirectQuery mode ใช้ HASONEVALUE ปลอดภัยกว่า

## คำถามที่พบบ่อย

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

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

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

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

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

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

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

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

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

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

## ฟังก์ชันที่เกี่ยวข้อง

- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)
- hasonevalue
- selectedvalue
- isfiltered
- values
- [IF – ฟังก์ชันตรรกะพื้นฐาน](https://www.thepexcel.com/functions/excel/logical/if/)
- blank
- iscrossfiltered

## แหล่งข้อมูลเพิ่มเติม

- [DAX Guide - HASONEFILTER](https://dax.guide/hasonefilter/) _(guide)_
- [Microsoft Learn - HASONEFILTER Function](https://learn.microsoft.com/en-us/dax/hasonefilter-function-dax) _(official)_
- [SQLBI - Filter Functions Reference](https://www.sqlbi.com/articles/filter-functions-in-dax/) _(guide)_

---

_Source: [https://www.thepexcel.com/functions/dax/information/hasonefilter-dax/](https://www.thepexcel.com/functions/dax/information/hasonefilter-dax/)_
