---
title: KEEPFILTERS – คงตัวกรองเดิมไว้ (Preserve Filters)
url: https://www.thepexcel.com/functions/dax/filter/keepfilters-dax/
type: function-explainer
program: DAX
syntax: "KEEPFILTERS(<filter>)"
date: 2025-12-13
updated: 2025-12-23
scores:
  popularity: 6
  difficulty: 6
  usefulness: 6
---

# KEEPFILTERS – คงตัวกรองเดิมไว้ (Preserve Filters)

> KEEPFILTERS เป็นฟังก์ชันปรับตัวกรองที่ใช้ภายใน CALCULATE เพื่อ “คงตัวกรองเดิมไว้” แล้วนำตัวกรองใหม่ม

## คำอธิบาย

KEEPFILTERS เป็นฟังก์ชันปรับตัวกรองที่ใช้ภายใน CALCULATE เพื่อ “คงตัวกรองเดิมไว้” แล้วนำตัวกรองใหม่มารวมกันแบบ AND (ตัดกันเฉพาะส่วนที่ตรงกัน) แทนพฤติกรรมปกติที่มักเขียนทับตัวกรองเดิมของคอลัมน์เดียวกัน

## Syntax

```excel
KEEPFILTERS(&lt;filter&gt;)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| filter | Yes | table/boolean |  | นิพจน์ตัวกรอง (ได้ทั้ง Boolean Filter หรือ Table Expression) ที่ต้องการนำไปรวมกับตัวกรองเดิมใน Context |

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

### คำนวณยอดขายสำหรับสินค้าที่เลือกและสีแดง

ถ้าผู้ใช้เลือกสินค้าใน Slicer แล้วอยากจะดูว่าในกลุ่มสินค้านั้นมี 'สีแดง' ขายได้เท่าไหร่

_เหมาะกับ:_ additive-filters

### การรวมตัวกรองจากหลายแหล่ง

เมื่อต้องการให้ตัวกรองจาก Measure และตัวกรองจาก Context ทำงานร่วมกันแบบ AND

_เหมาะกับ:_ combine-filters

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ยอดขายสินค้าสีแดง (คง Slicer อื่นไว้)

```excel
Red Sales = CALCULATE( [Total Sales], KEEPFILTERS('Product'[Color] = "Red") )
```

**ผลลัพธ์:** `ยอดขายเฉพาะสินค้าสีแดง ภายใน Context ที่ถูกกรองอยู่แล้ว`

ถ้ามีการเลือกปี 2023 ใน Slicer และมี Measure นี้ ตัวกรอง 'Product'[Color] = "Red" จะไปรวมกับ 'Date'[Year] = 2023 ทำให้ได้ยอดขายสินค้าสีแดงเฉพาะปี 2023

### 2. ตัวอย่างที่ 2: เปรียบเทียบ KEEPFILTERS vs CALCULATE ปกติ

```excel
// ❌ CALCULATE ปกติ (Override)
Brand A Sales Without KEEP =
CALCULATE([Total Sales], 'Product'[Brand] = "Brand A")

// ✅ CALCULATE + KEEPFILTERS (Intersection)
Brand A Sales With KEEP =
CALCULATE([Total Sales], KEEPFILTERS('Product'[Brand] = "Brand A"))

// Context: Sales table มี columns Brand, Amount
// User เลือก Brand B, C จาก Slicer
// Without KEEP: ยอดขาย Brand A ทั้งหมด 50,000 (Overwrite Slicer)
// With KEEP: BLANK หรือ 0 (Intersection - A ไม่ตรงกับ B,C)
```

**ผลลัพธ์:** `Slicer เลือก Brand B, C:
- Without KEEP: 50,000 (ยอดขาย Brand A ทั้งหมด)
- With KEEP: BLANK (ไม่มี A ในการเลือก)`

KEEPFILTERS ทำให้เงื่อนไข Brand=A นำมาตัดกับเงื่อนไขที่ Slicer เลือก (Brand in B,C) ผลจึงเป็น BLANK เพราะไม่มีแถวข้อมูลที่เป็น A และ (B หรือ C) ในเวลาเดียวกัน

### 3. ตัวอย่างที่ 3: แสดงเฉพาะสินค้า Top 10 ในหมวดที่เลือก

```excel
Top 10 Sales = 
CALCULATE( 
    [Total Sales], 
    KEEPFILTERS( TOPN(10, ALL('Product'), [Total Sales]) ) 
)
```

**ผลลัพธ์:** `ยอดขายสินค้า 10 อันดับแรก ภายในหมวดหมู่ที่เลือก`

KEEPFILTERS ทำให้ TOPN ทำงานร่วมกับ Filter หมวดหมู่สินค้าที่ผู้ใช้เลือก ไม่ใช่ดึง Top 10 ของทั้งบริษัทมาแสดง

### 4. ตัวอย่างที่ 4: KEEPFILTERS ในnested CALCULATE (Intersection Logic)

```excel
State Intersection Sales =
CALCULATE(
    CALCULATE([Total Sales], 
        'Geography'[State] = "WA" || 'Geography'[State] = "OR"
    ),
    KEEPFILTERS('Geography'[State] = "WA" || 'Geography'[State] = "BC")
)
// Context: Inner CALCULATE ต้องการ WA หรือ OR
// Outer KEEPFILTERS จำกัดเพิ่มเติมว่า WA หรือ BC
// ผลลัพธ์: Intersection = WA เท่านั้น
```

**ผลลัพธ์:** `ยอดขายสำหรับ WA เท่านั้น (WA|OR ∩ WA|BC = WA)`

KEEPFILTERS ในตัวอย่างนี้ใช้ใน nested CALCULATE เพื่อแสดง Intersection Logic: ตัวกรองภายใน (WA|OR) ตัดกับตัวกรองภายนอก (WA|BC) ได้ผลลัพธ์เพียง WA เพราะเป็นส่วนที่ตรงกัน

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

- KEEPFILTERS = Intersection Logic: ตัวกรองเดิม AND ตัวกรองใหม่ = เฉพาะส่วนที่ตรงกัน

- ใช้ KEEPFILTERS เมื่อต้องการให้ Measure 'ฟังเล่น' กับการเลือก Slicer โดยไม่ลบความเลือกนั้น

- Boolean Expression (Product[Brand]="A") และ FILTER ต่างกัน: Boolean Expression เร็วกว่า (Column Store) แต่ใช้ได้กับคอลัมน์จริง เท่านั้น FILTER ใช้ได้กับ Measure และ Virtual Columns

- KEEPFILTERS ทำงานกับทั้ง Boolean Expression และ FILTER ได้ แต่เมื่อใช้กับ FILTER ต้องเพิ่มความซับซ้อนหากมี virtual columns

- ประสิทธิภาพ: KEEPFILTERS ช่วยให้ Filter ทำงานในช่วง Context ที่แคบลง ส่วนใหญ่เร็วขึ้น เมื่อเทียบกับ Override ที่ใช้ ALL() เพื่อลบตัวกรองเดิม

- เปรียบเทียบกับ REMOVEFILTERS ที่เป็นตรงข้าม (ลบตัวกรองแทน)

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

**Q: KEEPFILTERS จำเป็นต้องใช้กับ CALCULATE ไหม?**

ใช่ KEEPFILTERS เป็น Filter Modifier ที่ออกแบบมาเพื่อทำงานร่วมกับ CALCULATE เท่านั้น

**Q: KEEPFILTERS ต่างจากการใส่เงื่อนไขใน CALCULATE แบบปกติอย่างไร?**

โดยปกติ Boolean Filter ใน CALCULATE มัก “เขียนทับ” ตัวกรองเดิมของคอลัมน์นั้น (Override) แต่เมื่อครอบด้วย KEEPFILTERS จะกลายเป็นการ “คงตัวกรองเดิม” และนำเงื่อนไขใหม่มารวมกันแบบ AND ทำให้ผลลัพธ์แคบลงตามทั้งสองเงื่อนไข

**Q: ทำไมบางครั้งได้ค่า BLANK?**

ถ้าตัวกรองเดิมและตัวกรองใหม่ไม่มีส่วนตัดกัน (เช่น Slicer เลือก Brand B,C แต่คุณใส่ KEEPFILTERS(Brand = "A")) ผลลัพธ์จะไม่มีแถวที่ผ่านเงื่อนไข จึงมักได้ BLANK หรือ 0 ขึ้นกับ Measure

**Q: ใช้ KEEPFILTERS กับ TOPN ได้เมื่อไหร่?**

ใช้เมื่อ TOPN สร้างตารางผู้ชนะ (เช่น Top 10) แล้วคุณต้องการให้ผลลัพธ์ยังเคารพตัวกรองเดิม (เช่น หมวดหมู่/ภูมิภาคที่ผู้ใช้เลือก) โดยให้ TOPN ทำงานภายในกรอบของ Context เดิม ไม่ใช่ดึง Top ทั้งบริษัท

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

- [DAX Guide: KEEPFILTERS](https://dax.guide/keepfilters/) _(guide)_
- [Microsoft Learn: KEEPFILTERS](https://learn.microsoft.com/en-us/dax/keepfilters-function-dax) _(official)_

---

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