Thep Excel

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

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

fx
=KEEPFILTERS(<filter>)

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

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
filter table/boolean นิพจน์ตัวกรอง (ได้ทั้ง Boolean Filter หรือ Table Expression) ที่ต้องการนำไปรวมกับตัวกรองเดิมใน Context

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 ที่ซับซ้อน เพราะมันอนุญาตให้คุณเพิ่มเงื่อนไขโดยไม่ยุบลงตัวกรองที่ผู้ใช้เลือกไว้แล้ว 😎

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

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

ผลลัพธ์ยอดขายเฉพาะสินค้าสีแดง ภายใน 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) ในเวลาเดียวกัน

fx
=// ❌ 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 ในการเลือก)
ตัวอย่างที่ 3: แสดงเฉพาะสินค้า Top 10 ในหมวดที่เลือกTop 10 Sales = CALCULATE( [Total Sales], KEEPFILTERS( TOPN(10, ALL('Product'), [Total Sales]) ) )

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

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

ผลลัพธ์ยอดขายสินค้า 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 เพราะเป็นส่วนที่ตรงกัน

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

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

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

ฟังก์ชันนี้KEEPFILTERSFilter
Filter (5)
ALL

ALL มีพฤติกรรมแตกต่างกัน 2 แบบ: ใช้เป็น Table Expression จะคืนทุกแถวในตาราง หรือทุกค่าในคอลัมน์ โดยไม่สนใจ Filter ใดๆ เหมาะสำหรับใช้ร่วมกับ FILTER, COUNTROWS, SUMMARIZE หรือใช้เป็น CALCULATE Modifier เพื่อลบ Filter ออกจากตารางหรือคอลัมน์ที่ระบุ ทำให้สามารถคำนวณ Grand Total หรือหาเปอร์เซ็นต์เทียบกับยอดรวมได้

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

CALCULATETABLE

CALCULATETABLE evaluate table expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน แล้วคืนค่าเป็น table (ตาราง) ซึ่งแตกต่างจาก CALCULATE ที่คืนค่าเป็น scalar value รองรับ filter arguments 3 รูปแบบ: Boolean expression, table expression, และ filter modifier functions (REMOVEFILTERS, ALL, KEEPFILTERS, USERELATIONSHIP, CROSSFILTER) มีพฤติกรรมเหมือน CALCULATE ในทุกแง่มุมของการจัดการ filter context รวมถึง context transition แต่เหมาะสำหรับการสร้าง intermediate table ที่ถูกกรองแล้วส่งต่อให้ iterator functions หรือใช้ใน calculated table มักมี performance ดีกว่า FILTER ใน simple filtering scenarios เพราะ DAX engine สามารถทำ cardinality estimation และ optimization ได้ดีกว่า

FILTER

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

REMOVEFILTERS

REMOVEFILTERS ลบ Filter ออกจากตารางหรือคอลัมน์ที่ระบุ ใช้ได้ใน CALCULATE เท่านั้น เทียบเท่า ALL เมื่อใช้เป็น CALCULATE Modifier แต่ชัดเจนและอ่านโค้ดง่ายกว่า แนะนำใช้แทน ALL เพราะสื่อความหมายได้ดีกว่า

Table manipulation (1)
TREATAS

TREATAS เป็นเสมือนการสร้าง "virtual relationship" โดยไม่ต้องแก้โมเดล ช่วยให้ส่งเงื่อนไขข้ามตารางที่ไม่เชื่อมกัน หรือเมื่อต้องการส่งหลายคีย์พร้อมกัน

Comments

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