Thep Excel

FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)

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

=FILTER(<table>, <filter>)

By ThepExcel AI Agent
20 December 2025

Function Metrics


Popularity
9/10

Difficulty
5/10

Usefulness
9/10

Syntax & Arguments

=FILTER(<table>, <filter>)

Argument Type Required Default Description
table table Yes ตารางหรือ Table Expression ที่ต้องการกรอง เช่น Sales, Products, ALL(Customers), VALUES(Products[Category])
filter boolean Yes เงื่อนไขที่ใช้กรอง ต้องคืนค่า TRUE หรือ FALSE สำหรับแต่ละแถว รองรับ Measure, Expression, และ RELATED()

How it works

กรองด้วย Measure (ค่าที่คำนวณได้)

ใช้ FILTER กรองด้วย Measure เช่น [Total Sales] > 50000 ซึ่งเป็นค่าที่คำนวณจาก SUM() ไม่ใช่คอลัมน์จริง Boolean Expression ทำไม่ได้

กรองด้วย Virtual Column (Expression)

ใช้ FILTER กรองด้วย Expression ที่คำนวณจากหลายคอลัมน์ เช่น Products[Price] * Products[Quantity] > 1000 ซึ่งเป็นค่าที่ไม่มีอยู่ใน Data Model

กรองหลายเงื่อนไขด้วย OR

ใช้ FILTER กรองด้วยหลายเงื่อนไขแบบ OR เช่น Products[Category] = "Electronics" || Products[Category] = "Appliances" ซึ่ง Boolean Expression เดี่ยวๆ ทำไม่ได้

Examples

ตัวอย่างที่ 1: เมื่อไม่ควรใช้ FILTER
// สมมติตาราง Products มีสินค้าสีแดง 5 รายการ // ยอดขายสินค้าสีแดงรวม = 45,800 // Boolean Expression (แนะนำ - เร็วกว่า) Red Products Sales = CALCULATE( SUM(Sale…
เมื่อกรองด้วยคอลัมน์จริงที่มีอยู่ใน Data Model (Products[Color]) ควรใช้ Boolean Expression เพราะได้ Columnar Storage Optimization
.
Microsoft แนะนำให้ใช้ Boolean Expression เป็นอันดับแรกเสมอ แล้วค่อยใช้ FILTER เมื่อจำเป็นจริงๆ
.
ส่วนตัวผมจำง่ายๆ ว่า "ถ้าคอลัมน์มีอยู่จริง ใช้ Boolean Expression ได้เลย ไม่ต้องใช้ FILTER" 💡
DAX Formula:

// สมมติตาราง Products มีสินค้าสีแดง 5 รายการ
// ยอดขายสินค้าสีแดงรวม = 45,800

// Boolean Expression (แนะนำ - เร็วกว่า)
Red Products Sales =
CALCULATE(
    SUM(Sales[Amount]),
    Products[Color] = "Red"  // ใช้แบบนี้แทน FILTER
)

Result:

45,800 (ยอดขายสินค้าสีแดง)

ตัวอย่างที่ 2: กรองด้วย Measure (ต้องใช้ FILTER)
// สมมติตาราง Products มี 100 สินค้า // มี 15 สินค้าที่ยอดขายเกิน 50,000 // Measure สำหรับคำนวณยอดขายต่อสินค้า Total Sales = SUM(Sales[Amount]) // นับสินค้าที่ข…
กรณีนี้ "ต้อง" ใช้ FILTER เพราะเงื่อนไขคือ Measure ([Total Sales]) ซึ่งเป็นค่าที่คำนวณได้ ไม่ใช่คอลัมน์จริง
.
ถ้าลองใช้ Boolean Expression จะ ERROR: "A Boolean expression that is used as a table filter expression cannot reference a measure."
.
นี่คือกรณีที่ FILTER จำเป็นจริงๆ เพราะไม่มีทางเลือกอื่น เรียกได้ว่าเป็น "ข้อยกเว้น" ที่ต้องใช้ FILTER
DAX Formula:

// สมมติตาราง Products มี 100 สินค้า
// มี 15 สินค้าที่ยอดขายเกิน 50,000

// Measure สำหรับคำนวณยอดขายต่อสินค้า
Total Sales =
SUM(Sales[Amount])

// นับสินค้าที่ขายได้มากกว่า 50,000
Top Products Count =
CALCULATE(
    COUNTROWS(Products),
    FILTER(
        Products,
        [Total Sales] > 50000
    )
)

Result:

15 (จำนวนสินค้าที่มียอดขายเกิน 50,000)

ตัวอย่างที่ 3: กรองด้วย Virtual Column (Expression)
// สมมติตาราง Sales มี 1,000 รายการ // มี 145 รายการที่ Quantity * UnitPrice > 10,000 // นับ Order ที่มูลค่ารวมเกิน 10,000 High Value Orders = CALCULATE( COUNTR…
Expression Sales[Quantity] * Sales[UnitPrice] เป็น "Virtual Column" ที่ไม่มีอยู่ใน Data Model ต้องคำนวณทีละแถว
.
ดังนั้น "ต้อง" ใช้ FILTER เพราะ Boolean Expression ทำไม่ได้ (ไม่สามารถใส่สูตรคำนวณใน Boolean Expression ได้)
.
ส่วนตัวผมถ้าใช้บ่อยจะสร้างเป็น Calculated Column ไว้เลย จะได้ไม่ต้องใช้ FILTER ทุกครั้ง ช่วยเรื่อง Performance ได้ 😎
DAX Formula:

// สมมติตาราง Sales มี 1,000 รายการ
// มี 145 รายการที่ Quantity * UnitPrice > 10,000

// นับ Order ที่มูลค่ารวมเกิน 10,000
High Value Orders =
CALCULATE(
    COUNTROWS(Sales),
    FILTER(
        Sales,
        Sales[Quantity] * Sales[UnitPrice] > 10000
    )
)

Result:

145 (จำนวน Order ที่มูลค่าเกิน 10,000)

ตัวอย่างที่ 4: กรองตาราง vs กรองคอลัมน์ (Golden Rule)
// สมมติ Sales เชื่อมกับ Products ด้วย ProductKey // ยอดขาย Electronics = 2,500,000 // ✅ วิธีถูก: กรองที่ Dimension Table โดยตรง Electronics Sales = CALCULATE(…
นี่คือ Golden Rule ที่สำคัญที่สุด: "Filter Columns, Not Tables" – กรองคอลัมน์ ไม่ใช่กรองตาราง!
.
❌ วิธีผิด (FILTER + RELATED) มีปัญหา 2 อย่าง:
1. Performance แย่มาก – ต้องวนลูปทุกแถวใน Fact Table (หลักแสน/ล้านแถว)
2. อาจให้ผลผิด – FILTER กับตารางจะกรอง "expanded table" ที่รวม dimension ทุกตัว อาจทำให้ได้ผลลัพธ์ไม่ถูกต้อง
.
✅ วิธีถูก (Boolean Expression) เร็วกว่า 100+ เท่า เพราะ DAX Engine optimize ให้อัตโนมัติ
.
ผมเคยเห็นหลายคนใช้ FILTER + RELATED แบบผิดๆ นะครับ เพราะคิดว่าต้องกรองที่ Fact Table ทั้งที่จริงๆ แค่กรองที่ Dimension Table ก็พอ! 😎
DAX Formula:

// สมมติ Sales เชื่อมกับ Products ด้วย ProductKey
// ยอดขาย Electronics = 2,500,000

// ✅ วิธีถูก: กรองที่ Dimension Table โดยตรง
Electronics Sales =
CALCULATE(
    SUM(Sales[Amount]),
    Products[Category] = "Electronics"  // Boolean Expression
)

// ❌ หลีกเลี่ยง: FILTER(Sales, RELATED(Products[Category]) = ...)
// ช้ามาก (วนลูปหลักแสนแถว) และอาจให้ผลผิด!

Result:

2,500,000 (ยอดขายสินค้า Electronics)

FAQs

ควรใช้ FILTER หรือ Boolean Expression ดี?

ใช้ Boolean Expression เสมอที่ทำได้ เพราะได้ Columnar Storage Optimization ทำให้เร็วกว่า 100+ เท่า
.
ใช้ FILTER เฉพาะเมื่อ “จำเป็น” กรณีเหล่านี้:
1. กรองด้วย Measure – เช่น [Total Sales] > 50000 (ค่าที่ต้องคำนวณ)
2. กรองด้วย Virtual Column/Expression – เช่น Price * Quantity > 1000 (คอลัมน์เสมือน)
3. กรองหลายเงื่อนไขด้วย OR – เช่น Category = “A” || Category = “B”
.
⚠️ สำคัญ: อย่าใช้ FILTER + RELATED เพื่อกรองข้ามตาราง! ให้กรองที่ Dimension Table โดยตรงแทน เช่น Products[Category] = “Electronics” แทนที่จะใช้ FILTER(Sales, RELATED(Products[Category]) = “Electronics”) 💡

FILTER ทำงานช้าจริงหรือ?

จริงครับ เพราะ FILTER เป็น Iterator Function ที่วนลูปทีละแถวและประเมินเงื่อนไข
.
ถ้าใช้กับตารางขนาดใหญ่เช่น Fact Table หลักแสนแถว จะช้ามาก ส่วน Boolean Expression ได้ Columnar Storage Optimization ทำให้เร็วกว่า
.
ส่วนตัวผมแนะนำไม่ให้ใช้ FILTER กับ Fact Table โดยตรง ถ้าทำได้ให้ใช้กับ Dimension Table แทน (เช่น Products, Customers) ซึ่งมีแถวน้อยกว่า 😅

Boolean Expression แปลงเป็น FILTER อัตโนมัติหรือเปล่า?

ใช่ครับ ภายในเครื่อง DAX จะแปลง Boolean Expression เป็น FILTER(ALL(Column), condition) อัตโนมัติ
.
แต่จะได้ Columnar Storage Optimization ทำให้เร็วมาก ส่วน FILTER ที่เขียนเอง จะไม่ได้ Optimization นี้ นี่คือเหตุผลที่ Boolean Expression เร็วกว่า FILTER มาก
.
ที่เจ๋งคือ DAX Engine ฉลาดพอที่จะ optimize ให้เราเอง แค่เราเขียนให้ถูกรูปแบบ 💡

ใช้ FILTER ใน CALCULATE ต้องระวังอะไร?

ต้องระวังเรื่อง KEEPFILTERS ถ้าใช้ FILTER ใน CALCULATE โดยตรง มันจะ “เขียนทับ” Filter Context ที่มีอยู่เดิม (เช่น Filter จากผู้ใช้เลือกใน Slicer)
.
ถ้าต้องการ “รวม” Filter แทนการเขียนทับ ให้ใช้ KEEPFILTERS ห่อไว้:
CALCULATE(…, KEEPFILTERS(FILTER(…)))
.
นี่สำคัญมากในการทำ Dashboard ที่มี User Interaction ส่วนตัวผมใช้ KEEPFILTERS บ่อยมากครับ 😎

FILTER กับ CALCULATETABLE ต่างกันอย่างไร?

ทั้งคู่ใช้กรองตารางได้เหมือนกัน แต่ CALCULATETABLE จะแปลงเงื่อนไขเป็น FILTER หลายตัวแยกกันตามคอลัมน์ ซึ่งบางกรณีเร็วกว่า
.
เอาจริงๆ Microsoft แนะนำว่า “อย่าคิดว่า CALCULATETABLE ดีกว่า FILTER เสมอไป” เพราะ Performance ขึ้นอยู่กับ Cardinality และ Granularity ของข้อมูล
.
ส่วนตัวผมใช้ FILTER เมื่อต้องการ control logic เอง และใช้ CALCULATETABLE เมื่อมีหลายเงื่อนไขที่เป็นอิสระต่อกัน

Resources & Related

Related functions

Additional Notes

FILTER เป็นฟังก์ชันที่ใช้กรองแถวในตารางตามเงื่อนไขที่กำหนด โดยจะวนลูปทุกแถวแล้วประเมินเงื่อนไขทีละแถว (Row-by-row evaluation) แล้วคืนค่าเป็นตารางที่มีเฉพาะแถวที่ผ่านเงื่อนไข
.
ที่เจ๋งคือ FILTER สามารถใช้เงื่อนไขที่ซับซ้อนได้ เช่น กรองด้วย Measure หรือ Expression ที่คำนวณจากหลายคอลัมน์ ซึ่ง Boolean Expression ธรรมดาทำไม่ได้
.
แต่ที่ต้องระวังคือ FILTER เป็น Iterator Function ที่ประมวลผลทีละแถว ดังนั้นถ้าใช้กับตารางขนาดใหญ่อาจทำงานช้า Microsoft แนะนำให้ใช้ Boolean Expression แทนเสมอที่ทำได้ เพราะได้ Columnar Storage Optimization ทำให้เร็วกว่ามาก
.
ส่วนตัวผมใช้ FILTER เฉพาะเมื่อ “จำเป็น” จริงๆ เช่น กรองด้วย Measure ([Total Sales] > 50000) หรือ Virtual Column (Products[Price] * Products[Quantity] > 1000) ซึ่งเป็นค่าที่ไม่มีอยู่ใน Data Model 😎

เมื่อไหร่ “ต้อง” ใช้ FILTER?

Boolean Expression ใน CALCULATE ไม่รองรับกรณีเหล่านี้:
.
1. Measure – กรองด้วยค่าที่ต้องคำนวณ เช่น [Total Sales] > 50000
2. Virtual Column/Expression – กรองด้วยสูตรคำนวณ เช่น Products[Price] * Products[Quantity] > 1000
3. OR Condition – กรองด้วยหลายเงื่อนไขแบบ OR เช่น Products[Category] = “A” || Products[Category] = “B”
.
เรียกได้ว่า “ใช้ FILTER เมื่อกรองด้วยสิ่งที่ Boolean Expression ทำไม่ได้” 💡

⚠️ Golden Rule: Filter Columns, Not Tables

กฎทองที่สำคัญที่สุดใน DAX คือ “กรองคอลัมน์ ไม่ใช่กรองตาราง” (Filter Columns, Not Tables)
.
อย่าทำ: FILTER(Sales, RELATED(Products[Category]) = “Electronics”) – ช้ามาก และอาจให้ผลผิด!
ให้ทำ: Products[Category] = “Electronics” – กรองที่ Dimension Table โดยตรง เร็วกว่า 100+ เท่า
.
เมื่อใช้ FILTER กับตาราง จะกรอง “expanded table” ที่รวม dimension ทุกตัว อาจทำให้ได้ผลลัพธ์ไม่ถูกต้อง ดังนั้น อย่าใช้ FILTER + RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน!

Leave a Reply

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