---
title: FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)
url: https://www.thepexcel.com/functions/dax/filter/filter-dax/
type: function-explainer
program: DAX
syntax: "FILTER(<table>, <filter>)"
date: 2025-12-20
scores:
  popularity: 9
  difficulty: 5
  usefulness: 9
---

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

> กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน (รองรับ Measure และ Expression)

## คำอธิบาย

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

## Syntax

```excel
FILTER(&lt;table&gt;, &lt;filter&gt;)
```

**Variant**

```excel
FILTER(&lt;table&gt;, &lt;filter&gt;)
```

กรองตารางด้วยเงื่อนไข 1 เงื่อนไข (ต้องคืนค่า TRUE/FALSE)

**Variant**

```excel
FILTER(&lt;table&gt;, &lt;condition1&gt; &amp;&amp; &lt;condition2&gt;)
```

กรองด้วยหลายเงื่อนไขแบบ AND (ทุกเงื่อนไขต้องเป็นจริง)

**Variant**

```excel
FILTER(&lt;table&gt;, &lt;condition1&gt; || &lt;condition2&gt;)
```

กรองด้วยหลายเงื่อนไขแบบ OR (เงื่อนไขใดเงื่อนไขหนึ่งเป็นจริงก็ผ่าน)

**Variant**

```excel
CALCULATE(&lt;expression&gt;, FILTER(&lt;table&gt;, &lt;filter&gt;))
```

ใช้ FILTER เป็น Filter Argument ใน CALCULATE (สำหรับ Virtual Column หรือ Measure)

**Variant**

```excel
FILTER(VALUES(Table[Column]), &lt;condition&gt;)
```

กรองจาก Distinct Values ของคอลัมน์ (ประหยัดกว่าการใช้ทั้งตาราง)

## Arguments

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

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

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

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

_เหมาะกับ:_ measure-based-filter

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

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

_เหมาะกับ:_ virtual-column-filter

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

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

_เหมาะกับ:_ or-condition-filter

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: เมื่อไม่ควรใช้ FILTER

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

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

**ผลลัพธ์:** `45,800 (ยอดขายสินค้าสีแดง)`

เมื่อกรองด้วยคอลัมน์จริงที่มีอยู่ใน Data Model (Products[Color]) ควรใช้ Boolean Expression เพราะได้ Columnar Storage Optimization
.
Microsoft แนะนำให้ใช้ Boolean Expression เป็นอันดับแรกเสมอ แล้วค่อยใช้ FILTER เมื่อจำเป็นจริงๆ
.
ส่วนตัวผมจำง่ายๆ ว่า "ถ้าคอลัมน์มีอยู่จริง ใช้ Boolean Expression ได้เลย ไม่ต้องใช้ FILTER" 💡

### 2. ตัวอย่างที่ 2: กรองด้วย Measure (ต้องใช้ FILTER)

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

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

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

**ผลลัพธ์:** `15 (จำนวนสินค้าที่มียอดขายเกิน 50,000)`

กรณีนี้ "ต้อง" ใช้ FILTER เพราะเงื่อนไขคือ Measure ([Total Sales]) ซึ่งเป็นค่าที่คำนวณได้ ไม่ใช่คอลัมน์จริง
.
ถ้าลองใช้ Boolean Expression จะ ERROR: "A Boolean expression that is used as a table filter expression cannot reference a measure."
.
นี่คือกรณีที่ FILTER จำเป็นจริงๆ เพราะไม่มีทางเลือกอื่น เรียกได้ว่าเป็น "ข้อยกเว้น" ที่ต้องใช้ FILTER

### 3. ตัวอย่างที่ 3: กรองด้วย Virtual Column (Expression)

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

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

**ผลลัพธ์:** `145 (จำนวน Order ที่มูลค่าเกิน 10,000)`

Expression Sales[Quantity] * Sales[UnitPrice] เป็น "Virtual Column" ที่ไม่มีอยู่ใน Data Model ต้องคำนวณทีละแถว
.
ดังนั้น "ต้อง" ใช้ FILTER เพราะ Boolean Expression ทำไม่ได้ (ไม่สามารถใส่สูตรคำนวณใน Boolean Expression ได้)
.
ส่วนตัวผมถ้าใช้บ่อยจะสร้างเป็น Calculated Column ไว้เลย จะได้ไม่ต้องใช้ FILTER ทุกครั้ง ช่วยเรื่อง Performance ได้ 😎

### 4. ตัวอย่างที่ 4: กรองตาราง vs กรองคอลัมน์ (Golden Rule)

```excel
// สมมติ 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]) = ...)
// ช้ามาก (วนลูปหลักแสนแถว) และอาจให้ผลผิด!
```

**ผลลัพธ์:** `2,500,000 (ยอดขายสินค้า Electronics)`

นี่คือ 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 ก็พอ! 😎

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

**⚠️ Golden Rule**: Filter Columns, Not Tables! อย่าใช้ FILTER กับทั้งตาราง โดยเฉพาะ FILTER + RELATED ช้ามากและอาจให้ผลผิด ให้กรองที่ Dimension Table โดยตรงแทน เช่น Products[Category] = "Electronics"

**Performance Warning**: FILTER เป็น Iterator Function ที่ช้า อย่าใช้กับ Fact Table ขนาดใหญ่ ถ้าทำได้ให้ใช้ Boolean Expression แทน

**เมื่อไหร่ต้องใช้ FILTER**: จำกฎง่ายๆ ว่า "ใช้ FILTER เมื่อ Boolean Expression ทำไม่ได้" เช่น Measure (ค่าคำนวณ), Virtual Column (Expression), OR Condition 💡

**KEEPFILTERS Tip**: ถ้าใช้ FILTER ใน Dashboard ที่มี Slicer ให้ใช้ KEEPFILTERS ห่อไว้เสมอ เพื่อ "รวม" Filter จากผู้ใช้ ไม่ใช่เขียนทับ: CALCULATE(..., KEEPFILTERS(FILTER(...))) 😎

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

**Q: ควรใช้ 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") 💡

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

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

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

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

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

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

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

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

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

- [CALCULATE – ฟังก์ชันหลักของ DAX ที่ควบคุม Filter Context](https://www.thepexcel.com/functions/dax/filter/calculate-dax/)
- [ALL – ลบ Filter หรือคืนค่าทุกแถว](https://www.thepexcel.com/functions/dax/filter/all-dax/)
- [ALLEXCEPT – ล้างตัวกรองทั้งหมดยกเว้นคอลัมน์ที่ระบุ](https://www.thepexcel.com/functions/dax/filter/allexcept-dax/)
- [KEEPFILTERS – คงตัวกรองเดิมไว้ (Preserve Filters)](https://www.thepexcel.com/functions/dax/filter/keepfilters-dax/)
- [REMOVEFILTERS – ลบตัวกรองออกจากตาราง/คอลัมน์](https://www.thepexcel.com/functions/dax/filter/removefilters-dax/)
- [VALUES – ดึงค่าที่ไม่ซ้ำจากคอลัมน์ (รวม Blank จากข้อผิดพลาดความสัมพันธ์)](https://www.thepexcel.com/functions/dax/table-manipulation/values-dax/)
- [RELATED – ดึงค่าจากตารางที่มีความสัมพันธ์ (Many → One)](https://www.thepexcel.com/functions/dax/relationship/related-dax/)
- [RELATEDTABLE – คืนตารางฝั่ง Many ที่สัมพันธ์กับแถวปัจจุบัน (One → Many)](https://www.thepexcel.com/functions/dax/relationship/relatedtable-dax/)
- [COUNTROWS – นับจำนวนแถวในตารางและเทบิลเสมือน](https://www.thepexcel.com/functions/dax/aggregation/countrows-dax/)
- [SUMX – Iterator Function สำหรับคำนวณผลรวมแบบ Row-by-Row ใน DAX](https://www.thepexcel.com/functions/dax/aggregation/sumx-dax/)
- [CALCULATETABLE – Evaluate Table Expression ใน Modified Filter Context](https://www.thepexcel.com/functions/dax/filter/calculatetable-dax/)
- [AND – ตรวจสอบเงื่อนไขตรรกะในDAX](https://www.thepexcel.com/functions/dax/logical/and-dax/)
- [OR – ตรวจสอบว่ามีเงื่อนไขใดเป็นจริง](https://www.thepexcel.com/functions/dax/logical/or-dax/)

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

- [Microsoft Learn: FILTER function](https://learn.microsoft.com/en-us/dax/filter-function-dax) _(documentation)_
- [Microsoft Learn: Avoid using FILTER as a filter argument](https://learn.microsoft.com/en-us/dax/best-practices/dax-avoid-avoid-filter-as-filter-argument) _(guide)_
- [DAX Guide: FILTER](https://dax.guide/filter/) _(documentation)_
- [SQLBI: From SQL to DAX - Filtering Data](https://www.sqlbi.com/articles/from-sql-to-dax-filtering-data/) _(guide)_
- [SQLBI: Filter Columns, Not Tables in DAX](https://www.sqlbi.com/articles/filter-columns-not-tables-in-dax/) _(guide)_

---

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