---
title: TREATAS – ส่งค่าข้ามตารางแบบเสมือน ไม่ต้องมี Relationship
url: https://www.thepexcel.com/functions/dax/table-manipulation/treatas-dax/
type: function-explainer
program: DAX
syntax: "TREATAS(table_expression, column, [column])"
date: 2025-12-13
updated: 2025-12-22
scores:
  popularity: 6
  difficulty: 6
  usefulness: 7
---

# TREATAS – ส่งค่าข้ามตารางแบบเสมือน ไม่ต้องมี Relationship

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

## คำอธิบาย

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

## Syntax

```excel
TREATAS(table_expression, column, [column])
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| table_expression | Yes | Table |  | ตาราง/นิพจน์ที่จะใช้เป็นแหล่งค่า (เช่น VALUES() หรือ SUMMARIZE() ที่คืนตาราง) |
| column | Yes | Column |  | คอลัมน์ปลายทาง (target column) ที่จะถูกจำกัดด้วยค่าจาก table_expression สามารถระบุ 2-3 คอลัมน์เพื่อส่งหลายคีย์ (compound key) พร้อมกัน |

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

### ส่งเงื่อนไขจากตารางที่ไม่ได้เชื่อม relationship

เมื่อมีตาราง lookup แยกต่างหากและต้องการให้การเลือกใน slicer ไปจำกัดตาราง fact

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

### ส่งเงื่อนไขไปหลายคอลัมน์พร้อมกัน

ใช้ตารางที่มีหลายคอลัมน์ (เช่น ปี/เดือน) แล้วส่งไปจำกัดหลายคอลัมน์ในตารางปลายทาง

_เหมาะกับ:_ multi-column-criteria

## ตัวอย่าง

### 1. ตัวอย่างพื้นฐาน: ส่งค่า Category จาก Lookup ไปจำกัด Sales

```excel
Total Sales by Selected Categories =
CALCULATE(
    SUM(Sales[Amount]),
    TREATAS(
        VALUES(ProductLookup[Category]),
        Product[Category]
    )
)
```

**ผลลัพธ์:** `ยอดขายที่ match กับ Category ที่เลือกใน ProductLookup`

VALUES() ดึงค่า Category ที่ unique จาก ProductLookup แล้ว TREATAS ทำให้มันเป็นเงื่อนไขจำกัดบน Product[Category] ได้ แม้ ProductLookup ไม่มี relationship กับ Sales

### 2. ส่งค่าแบบ Hard-Coded (ไม่ใช่ dynamic)

```excel
Sales for Red Blue White =
CALCULATE(
    SUM(Sales[Amount]),
    TREATAS(
        {"Red", "Blue", "White"},
        Product[Color]
    )
)
```

**ผลลัพธ์:** `ยอดขายเฉพาะสีแดง น้ำเงิน และขาว`

{} bracket สร้าง list ของค่า TREATAS นำค่า 3 สีนี้ไปจำกัด Product[Color] ง่ายกว่า FILTER และเร็วกว่า

### 3. Compound Key: ส่งปี-เดือนพร้อมกัน

```excel
Sales by Period Selected =
VAR SelectedPeriods = SUMMARIZE(DateLookup, DateLookup[Year], DateLookup[Month])
RETURN
CALCULATE(
    SUM(Sales[Amount]),
    TREATAS(
        SelectedPeriods,
        Date[Year],
        Date[Month]
    )
)
```

**ผลลัพธ์:** `ยอดขายจะถูกจำกัดให้ตรงกับปี-เดือนที่เลือก`

SUMMARIZE() คืนตาราง 2 คอลัมน์ (Year, Month) และ TREATAS จับคู่กับ Date[Year] กับ Date[Month] พร้อมกัน ใช้ VAR เพื่อความชัดเจน

### 4. ใช้ร่วมกับ KEEPFILTERS เพื่อไม่ให้ลบเงื่อนไขเดิม

```excel
Sales Intersected =
CALCULATE(
    SUM(Sales[Amount]),
    KEEPFILTERS(
        TREATAS(
            VALUES(Lookup[ProductCode]),
            Product[Code]
        )
    )
)
```

**ผลลัพธ์:** `ยอดขายตัดกับเงื่อนไข Lookup และเงื่อนไขเดิมจาก slicer`

TREATAS ปกติจะ replace filter context (เช่น CALCULATE) แต่ KEEPFILTERS ทำให้มันทำงานร่วม (AND) แทน replace (OR)

### 5. นับ Customers ที่ตรงกับ Selected Regions

```excel
Count Customers in Selected Regions =
CALCULATE(
    DISTINCTCOUNT(Customer[ID]),
    TREATAS(
        VALUES(RegionLookup[RegionName]),
        Customer[Region]
    )
)
```

**ผลลัพธ์:** `จำนวน unique customers ใน region ที่เลือก`

ไม่ต้องตั้ง relationship ระหว่าง Customer และ RegionLookup ใช้ TREATAS ก็ได้ผล แถมสามารถเปลี่ยนค่า regionlookup ได้เลย

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

- TREATAS ทำงาน "matching by value" ไม่ใช่ "matching by position" - ต้องแน่ใจว่าข้อมูลตรง

- ใช้ VAR เก็บ TREATAS result เพื่อ reuse และง่ายต่อการ debug

- TREATAS + KEEPFILTERS = AND, TREATAS ปกติ = REPLACE - เลือกตามว่าต้องการ behavior อะไร

- Performance: TREATAS ดีกว่า FILTER เพราะไม่ iterate rows - ใช้เมื่อได้

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

**Q: TREATAS vs FILTER – เมื่อไหร่ใช้ตัวไหน?**

TREATAS ใช้เมื่อ: 1) ต้องส่งค่าจากตารางหนึ่งไปจำกัดอีกตารางที่ไม่เชื่อม 2) ต้องการ map columns (compound key) 3) ต้องการ performance ดี (ไม่ iterate). FILTER ใช้เมื่อต้องการเงื่อนไขที่ซับซ้อน หรือ iterate ทีละ row

**Q: TREATAS vs USERELATIONSHIP ต่างกันอย่างไร?**

USERELATIONSHIP ใช้เปิดความสัมพันธ์ที่มีอยู่แล้ว แต่อยู่ในสถานะ inactive (ระบุด้วย Relationship ID). TREATAS สร้างความสัมพันธ์เสมือน โดยไม่ต้องมี relationship จริงในโมเดล

**Q: ถ้าค่าใน Expression ไม่อยู่ในคอลัมน์ปลายทาง จะเกิดอะไร?**

ไม่เป็นไร ค่าที่ไม่อยู่จะถูกไม่สนใจ (ignored) TREATAS ไม่ผิดพลาด มันแค่ไม่ลบแถวใดๆ ก็ได้ เหมือนจำนวน intersection ของเซต

**Q: TREATAS สนับสนุน DirectQuery ไหม?**

ได้ แต่มีข้อจำกัด ใช้ได้ใน Measure แต่ไม่ใช้ได้ใน Calculated Column หรือ RLS (Row-Level Security) ใน DirectQuery

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

- [CALCULATE – ฟังก์ชันหลักของ DAX ที่ควบคุม Filter Context](https://www.thepexcel.com/functions/dax/filter/calculate-dax/)
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)
- [VALUES – ดึงค่าที่ไม่ซ้ำจากคอลัมน์ (รวม Blank จากข้อผิดพลาดความสัมพันธ์)](https://www.thepexcel.com/functions/dax/table-manipulation/values-dax/)
- [SUMMARIZE – จัดกลุ่มข้อมูลและสร้างตารางสรุป (Table Grouping)](https://www.thepexcel.com/functions/dax/table-manipulation/summarize-dax/)
- [USERELATIONSHIP – เลือกใช้ relationship ที่ไม่ใช่ active](https://www.thepexcel.com/functions/dax/relationship/userelationship-dax/)
- [KEEPFILTERS – คงตัวกรองเดิมไว้ (Preserve Filters)](https://www.thepexcel.com/functions/dax/filter/keepfilters-dax/)

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

- [Microsoft Learn: TREATAS Function](https://learn.microsoft.com/en-us/dax/treatas-function) _(official)_
- [DAX Guide: TREATAS](https://dax.guide/treatas/) _(guide)_
- [SQLBI: Advanced DAX Filtering with TREATAS](https://www.sqlbi.com/articles/treatas/) _(guide)_

---

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