Thep Excel

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

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

=KEEPFILTERS(<filter>)

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
6/10

Difficulty
6/10

Usefulness
6/10

Syntax & Arguments

=KEEPFILTERS(<filter>)

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

How it works

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

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

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

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

Examples

ตัวอย่างที่ 1: ยอดขายสินค้าสีแดง (คง Slicer อื่นไว้)
Red Sales = CALCULATE( [Total Sales], KEEPFILTERS('Product'[Color] = "Red") )
ถ้ามีการเลือกปี 2023 ใน Slicer และมี Measure นี้ ตัวกรอง 'Product'[Color] = "Red" จะไปรวมกับ 'Date'[Year] = 2023 ทำให้ได้ยอดขายสินค้าสีแดงเฉพาะปี 2023
DAX Formula:

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

Result:

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

ตัวอย่างที่ 2: เปรียบเทียบ KEEPFILTERS vs CALCULATE ปกติ
// ❌ CALCULATE ปกติ (Override) Brand A Sales Without KEEP = CALCULATE([Total Sales], 'Product'[Brand] = "Brand A") // ✅ CALCULATE + KEEPFILTERS (Intersection) B…
KEEPFILTERS ทำให้เงื่อนไข Brand=A นำมาตัดกับเงื่อนไขที่ Slicer เลือก (Brand in B,C) ผลจึงเป็น BLANK เพราะไม่มีแถวข้อมูลที่เป็น A และ (B หรือ C) ในเวลาเดียวกัน
DAX Formula:

=// ❌ 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)

Result:

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

ตัวอย่างที่ 3: แสดงเฉพาะสินค้า Top 10 ในหมวดที่เลือก
Top 10 Sales = CALCULATE( [Total Sales], KEEPFILTERS( TOPN(10, ALL('Product'), [Total Sales]) ) )
KEEPFILTERS ทำให้ TOPN ทำงานร่วมกับ Filter หมวดหมู่สินค้าที่ผู้ใช้เลือก ไม่ใช่ดึง Top 10 ของทั้งบริษัทมาแสดง
DAX Formula:

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

Result:

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

ตัวอย่างที่ 4: KEEPFILTERS ในnested CALCULATE (Intersection Logic)
State Intersection Sales = CALCULATE( CALCULATE([Total Sales], 'Geography'[State] = "WA" || 'Geography'[State] = "OR" ), KEEPFILTERS('Geography'[State] = "WA" |…
KEEPFILTERS ในตัวอย่างนี้ใช้ใน nested CALCULATE เพื่อแสดง Intersection Logic: ตัวกรองภายใน (WA|OR) ตัดกับตัวกรองภายนอก (WA|BC) ได้ผลลัพธ์เพียง WA เพราะเป็นส่วนที่ตรงกัน
DAX Formula:

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 เท่านั้น

Result:

ยอดขายสำหรับ WA เท่านั้น (WA|OR ∩ WA|BC = WA)

FAQs

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

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

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

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

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

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

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

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

Resources & Related

Additional Notes

KEEPFILTERS เป็นฟังก์ชัน Filter Modifier ที่ใช้ภายใน CALCULATE (หรือ CALCULATETABLE) เพื่อ คงตัวกรองเดิมที่มีอยู่ ไม่ให้ถูกเขียนทับ (Overwrite) ด้วยตัวกรองใหม่ที่เราใส่เข้าไปใน CALCULATE

โดยปกติแล้ว เมื่อเราใส่ Filter ใน CALCULATE ตัวกรองเหล่านั้นจะ Overwrite ตัวกรองเดิมที่อยู่ใน Context (เช่น เมื่อใช้ Slicer เลือก WA และเขียน CALCULATE(measure, state=”OR”) ผลลัพธ์จะเป็น OR ไม่ใช่ WA) แต่ KEEPFILTERS จะเปลี่ยนพฤติกรรมนั้นให้เป็นการนำตัวกรองเดิมและตัวกรองใหม่มาตัดกัน (Intersection / AND Logic) ดังนั้นจะได้เฉพาะส่วนที่ตรงกัน

ทำงานได้ดีกับ Iterator Functions (SUMX, AVERAGEX, MAXX ฯลฯ) ที่ต้องการ Preserve ตัวกรองข้างนอก ขณะที่ Iterate ผ่านแต่ละแถว

ส่วนตัวผม เห็นว่า KEEPFILTERS เป็นเครื่องมือที่ทรงพลังสำหรับการควบคุม Filter Context ใน Dashboard ที่ซับซ้อน เพราะมันอนุญาตให้คุณเพิ่มเงื่อนไขโดยไม่ยุบลงตัวกรองที่ผู้ใช้เลือกไว้แล้ว 😎

Leave a Reply

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