---
title: RELATED – ดึงค่าจากตารางที่มีความสัมพันธ์ (Many → One)
url: https://www.thepexcel.com/functions/dax/relationship/related-dax/
type: function-explainer
program: DAX
syntax: "RELATED(<column>)"
date: 2025-12-13
updated: 2025-12-20
scores:
  popularity: 9
  difficulty: 3
  usefulness: 9
---

# RELATED – ดึงค่าจากตารางที่มีความสัมพันธ์ (Many → One)

> ดึงค่าเดี่ยวจากตารางฝั่ง One ผ่าน relationship (Many → One)

## คำอธิบาย

RELATED คืนค่า scalar value (ค่าเดี่ยว) จากคอลัมน์ในตารางที่มีความสัมพันธ์แบบ many-to-one โดยอาศัย relationship ที่กำหนดไว้ในโมเดล ฟังก์ชันนี้ต้องการ row context และสามารถ traverse relationship chain ข้ามหลายขั้นได้ตราบใดที่ทุก relationship อยู่ในทิศทางเดียวกัน

## Syntax

```excel
RELATED(&lt;column&gt;)
```

**Variant**

```excel
RELATED(&lt;column&gt;)
```

ดึงค่าจาก column ที่ระบุในตารางที่มี relationship แบบ many-to-one กับตารางปัจจุบัน ต้องใช้ใน row context (calculated column หรือ iterator function)

**Variant**

```excel
RELATED(Table1[Column1])
```

รูปแบบพื้นฐาน ระบุ table และ column ที่ต้องการดึงค่า (แนะนำให้ระบุ table name เสมอเพื่อความชัดเจน)

**Variant**

```excel
RELATED(Table2[Column]) + RELATED(Table3[Column])
```

ใช้หลายครั้งใน expression เดียวกันได้ เช่น คำนวณผลรวมจากหลายตารางที่เกี่ยวข้อง

**Variant**

```excel
SUMX(Sales, Sales[Quantity] * RELATED(Product[UnitPrice]))
```

ใช้ภายใน iterator function เพื่อคำนวณแต่ละแถว โดย iterator สร้าง row context ให้อัตโนมัติ

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| column | Yes | column |  | คอลัมน์ที่ต้องการดึงค่า ต้องอยู่ในตารางที่มี relationship แบบ many-to-one กับตารางปัจจุบัน (ตารางที่ดึงต้องอยู่ฝั่ง One) รูปแบบ: Table[Column] |

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

### Enrich ข้อมูลจากตารางมาสเตอร์ใน Calculated Column

ดึงข้อมูลจากตารางมาสเตอร์ (Product, Customer, Category) มาเติมใน fact table (Sales, Orders) เช่น ดึงชื่อสินค้า หมวดหมู่ ต้นทุนต่อหน่วย ประเภทลูกค้า เพื่อให้สามารถใช้งานโดยตรงในตารางข้อมูล

_เหมาะกับ:_ enrich-fact-table

### คำนวณต้นทุนขายใน Measure (COGS Calculation)

ใช้ SUMX iterate แต่ละแถวของ Sales แล้วดึงต้นทุนต่อหน่วยจาก Product มาคูณกับจำนวนที่ขาย เพื่อคำนวณต้นทุนขายรวม (Cost of Goods Sold)

_เหมาะกับ:_ cogs-calculation

### คำนวณข้ามตารางใน Iterator (เช่น SUMX, AVERAGEX)

ใช้ RELATED ภายใน iterator function เช่น SUMX, AVERAGEX เพื่อดึงข้อมูลจากตารางที่เกี่ยวข้อง เช่น SUMX(Sales, Sales[Quantity] * RELATED(Product[Cost])) ซึ่งเป็น use case หลักของ RELATED ใน DAX

_เหมาะกับ:_ iterator-related-calculation

### Lookup ราคาปัจจุบันจากตารางราคา

ดึงราคาล่าสุดจากตาราง Price List ที่มี relationship กับ Product มาใช้คำนวณรายได้หรือส่วนลดตามราคาปัจจุบัน

_เหมาะกับ:_ price-lookup

### Traverse Relationship Chain (Multi-Hop)

เดินผ่าน relationship หลายขั้น เช่น Sales → Product → Category → Division เพื่อดึงข้อมูลจาก Division โดยตรงโดยไม่ต้องผ่าน intermediate tables

_เหมาะกับ:_ multi-hop-traversal

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ดึงชื่อสินค้าใน Calculated Column (พื้นฐาน)

```excel
Product Name = RELATED(Product[ProductName])
```

**ผลลัพธ์:** `ได้ชื่อสินค้าที่ตรงกับ ProductKey ของแถวนั้น เช่น "Laptop Pro 15", "Wireless Mouse", "USB Cable"`

สร้าง calculated column ในตาราง Sales โดย RELATED จะ traverse relationship จาก Sales[ProductKey] → Product[ProductKey] แล้วดึง ProductName กลับมา
.
ทุกแถวของ Sales จะได้ชื่อสินค้าที่ตรงกับ ProductKey ของแถวนั้นๆ ครับ

### 2. ตัวอย่างที่ 2: คำนวณยอดขายจากราคาต่อหน่วย (Practical)

```excel
Line Total = Sales[Quantity] * RELATED(Product[UnitPrice])
```

**ผลลัพธ์:** `ได้ยอดขายของแต่ละแถว เช่น 5 * 299 = 1,495 บาท`

สร้าง calculated column ในตาราง Sales โดยดึง UnitPrice จาก Product มาคูณกับ Quantity ในแต่ละแถว
.
ผลลัพธ์จะเก็บไว้ในโมเดลและไม่เปลี่ยนแปลงตาม filter context ครับ ส่วนตัวผมแนะนำให้ใช้ใน measure แทนถ้าต้องการความยืดหยุ่นมากกว่า

### 3. ตัวอย่างที่ 3: คำนวณต้นทุนขายใน Measure ด้วย SUMX (Advanced)

```excel
Total COGS =
SUMX(
    Sales,
    Sales[Quantity] * RELATED(Product[StandardCost])
)
```

**ผลลัพธ์:** `ได้ต้นทุนขายรวม เช่น 125,450 บาท (ผลรวมของ Quantity × StandardCost ทุกแถวที่อยู่ใน filter context)`

SUMX iterate แต่ละแถวของ Sales (สร้าง row context) แล้วใน expression ของแต่ละแถว ใช้ RELATED ดึง StandardCost จาก Product มาคูณกับ Quantity
.
จากนั้น SUMX รวมผลลัพธ์ทั้งหมด วิธีนี้เจ๋งตรงที่ measure จะตอบสนอง filter context ได้ครับ เช่น กรองเฉพาะปี 2024 หรือเฉพาะหมวด Electronics ก็ได้

### 4. ตัวอย่างที่ 4: กรอง Sales ด้วยหมวดสินค้า (Best Practice)

```excel
// ✅ วิธีถูก: กรองที่ Dimension Table โดยตรง (เร็ว + ถูกต้อง)
Premium Sales Count =
CALCULATE(
    COUNTROWS(Sales),
    Product[Category] = "Premium"
)

// ❌ หลีกเลี่ยง: FILTER(Sales, RELATED(Product[Category]) = "Premium")
// ช้ามาก (วนลูปทุกแถวใน Fact Table) และอาจให้ผลผิด!
```

**ผลลัพธ์:** `ได้จำนวนรายการขายที่เป็นสินค้าหมวด Premium เช่น 342 รายการ`

⚠️ Golden Rule: Filter Columns, Not Tables!
.
✅ วิธีถูก: ใช้ CALCULATE กับ Boolean Expression กรองที่ Product[Category] โดยตรง DAX Engine จะ optimize ให้อัตโนมัติ เร็วกว่า 100+ เท่า
.
❌ วิธีผิด: FILTER(Sales, RELATED(...)) ต้องวนลูปทุกแถวใน Fact Table (หลักแสน/ล้านแถว) และกรอง "expanded table" ที่อาจให้ผลผิด
.
ส่วนตัวผมเคยเห็นหลายคนใช้ FILTER + RELATED แบบผิดๆ เพราะคิดว่าต้องกรองที่ Fact Table ทั้งที่จริงๆ แค่กรองที่ Dimension Table ก็พอครับ! 😎

### 5. ตัวอย่างที่ 5: Traverse Multi-Hop Relationship ด้วย VAR...RETURN (Real-World)

```excel
Sales by Division =
VAR SalesWithDivision =
    ADDCOLUMNS(
        Sales,
        "Division", RELATED(Category[DivisionName])
    )
VAR FilteredSales =
    FILTER(
        SalesWithDivision,
        [Division] = "Consumer Electronics"
    )
RETURN
    SUMX(FilteredSales, Sales[Amount])
```

**ผลลัพธ์:** `ได้ยอดขายของ Division "Consumer Electronics" เช่น 2,450,000 บาท`

ตัวอย่างนี้แสดง multi-hop relationship traversal โดย RELATED ข้ามจาก Sales → Product → Category → Division (สมมติมี relationship chain นี้) แล้วดึง DivisionName มาใช้
.
VAR แรกสร้างตารางชั่วคราวที่เติมคอลัมน์ Division VAR ที่สองกรองเฉพาะ Division ที่ต้องการ สุดท้าย SUMX รวมยอดขาย
.
ส่วนตัวผมชอบใช้ VAR...RETURN แบบนี้ครับ เพราะอ่านและ debug ได้ง่ายกว่าเขียนซ้อนกันเยอะๆ

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

⚠️ **Golden Rule - อย่าใช้ FILTER + RELATED เพื่อกรองข้ามตาราง!**
.
❌ FILTER(Sales, RELATED(Product[Category]) = "X") → ช้ามาก + อาจผิด
✅ CALCULATE(..., Product[Category] = "X") → กรองที่ Dimension โดยตรง เร็วกว่า 100+ เท่า

💡 **Best Practice:** ใช้ RELATED ใน iterator function (เช่น SUMX) เพื่อดึงข้อมูลมาคำนวณ ไม่ใช่เพื่อกรอง
.
เช่น SUMX(Sales, Sales[Qty] * RELATED(Product[Cost])) ✅

⚠️ **Row Context Required:** RELATED ต้องการ row context หากใช้โดยตรงใน measure ที่มีแต่ filter context จะ error ต้องใช้ภายใน iterator function เสมอครับ เช่น SUMX, ADDCOLUMNS

🔍 **Relationship Direction:** ตรวจสอบทิศทางของ relationship ใน Model view เสมอก่อนใช้ RELATED ถ้าทิศทางผิดหรือไม่มี relationship จะ error ทันที 😎

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

**Q: RELATED ต่างจาก LOOKUPVALUE อย่างไร?**

RELATED อาศัย relationship ที่กำหนดไว้ในโมเดล ทำงานเร็วกว่ามาก และใช้ได้เฉพาะทิศทาง many-to-one เท่านั้น
.
ส่วน LOOKUPVALUE ไม่ต้องการ relationship สามารถ lookup ด้วยเงื่อนไขใดก็ได้ (หลายคอลัมน์ หลายเงื่อนไข) แต่ช้ากว่าและต้องระวังกรณีพบหลายแถวที่ตรงกัน (จะเกิด error)
.
ส่วนตัวผมแนะนำให้ใช้ RELATED เสมอเมื่อมี relationship อยู่แล้วครับ ใช้ LOOKUPVALUE เฉพาะกรณีที่ไม่มี relationship จริงๆ

**Q: RELATED ต่างจาก RELATEDTABLE อย่างไร?**

ความแตกต่างหลักคือทิศทางและชนิดข้อมูลที่คืนกลับครับ
.
RELATED ใช้ในตารางฝั่ง Many → ดึงค่าเดี่ยวจากตารางฝั่ง One (คืนค่า scalar) ส่วน RELATEDTABLE ใช้ในตารางฝั่ง One → ดึงตารางจากฝั่ง Many (คืนค่า table ที่มีหลายแถว)
.
ตัวอย่างง่ายๆ ใน Sales ใช้ RELATED(Product[ProductName]) จะได้ชื่อสินค้า 1 ชื่อ แต่ใน Product ใช้ RELATEDTABLE(Sales) จะได้ตารางที่มีทุกแถวของ Sales ที่ขายสินค้าชิ้นนั้น

**Q: RELATED ใช้ได้ใน Measure หรือไม่?**

ใช้ได้ครับ แต่ต้องใช้ภายใน iterator function เช่น SUMX, FILTER ที่สร้าง row context ให้
.
เพราะ RELATED ต้องการ row context ในการทำงาน ไม่สามารถใช้ RELATED โดยตรงใน measure ที่มีแต่ filter context ได้ (จะเกิด error ทันที)
.
ตัวอย่าง: SUMX(Sales, Sales[Quantity] * RELATED(Product[UnitPrice])) ทำงานได้ แต่ RELATED(Product[UnitPrice]) เฉพาะๆ ใน measure ทำงานไม่ได้นะครับ

**Q: จะรู้ได้อย่างไรว่า Relationship ทิศทางไหนคือ Many และ One?**

ดูที่ลูกศรของ relationship line ใน Model view ครับ ลูกศรจะชี้จากตารางฝั่ง Many ไปยังตารางฝั่ง One
.
เช่น Sales → Product (Sales คือ Many, Product คือ One) หรือดูที่ multiplicity indicator (1 กับ *) เช่น Sales (*) → Product (1) หมายความว่า Sales มีหลายแถวต่อ 1 Product
.
ดังนั้นใช้ RELATED ใน Sales ได้ แต่ใช้ใน Product ไม่ได้ (ต้องใช้ RELATEDTABLE แทน)

**Q: RELATED ทำงานกับ Bidirectional Relationship อย่างไร?**

RELATED ทำงานได้ทั้งสองทิศทางถ้า relationship ตั้งค่าเป็น bidirectional (Both) ครับ
.
แต่ส่วนตัวผมแนะนำให้ใช้อย่างระมัดระวัง เพราะ bidirectional relationship อาจทำให้เกิด ambiguity และ performance issues ใน DAX ได้
.
ควรใช้ single direction (One) เสมอเมื่อเป็นไปได้ และใช้ CROSSFILTER หรือ USERELATIONSHIP ใน CALCULATE เมื่อต้องการเปลี่ยนทิศทางชั่วคราว

**Q: RELATED ทำงานกับ Limited Relationship หรือไม่?**

ไม่ได้ครับ RELATED ต้องการ regular relationship เท่านั้น ไม่สามารถทำงานกับ limited relationship ได้
.
(เช่น relationship ที่ข้าม DirectQuery boundary หรือ composite model boundary)
.
หากต้องการ traverse limited relationship ให้ใช้ LOOKUPVALUE แทน หรือใช้ RELATEDTABLE ซึ่งสามารถข้าม limited relationship ได้ผ่าน context transition

**Q: การใช้ RELATED ใน Calculated Column เยอะมีผลกระทบต่อ Performance หรือไม่?**

มีผลกระทบต่อขนาดโมเดลและหน่วยความจำครับ แต่ไม่ค่อยกระทบต่อ query performance มากนัก
.
เพราะ calculated column ถูก evaluate ครั้งเดียวเมื่อ refresh ข้อมูล แต่ผลลัพธ์จะเก็บไว้ในโมเดล ทำให้เพิ่มขนาดไฟล์และ RAM ที่ใช้
.
หาก calculated column มีจำนวนมาก ส่วนตัวผมแนะนำให้ทำ data transformation ใน Power Query แทน หรือใช้ใน measure แทนเมื่อเป็นไปได้ (measure คำนวณตอน query time ไม่เพิ่มขนาดโมเดล)

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

- [RELATEDTABLE – คืนตารางฝั่ง Many ที่สัมพันธ์กับแถวปัจจุบัน (One → Many)](https://www.thepexcel.com/functions/dax/relationship/relatedtable-dax/)
- [LOOKUPVALUE – ค้นหาและดึงค่าจากตารางตามเงื่อนไขหลายตัว](https://www.thepexcel.com/functions/dax/filter/lookupvalue-dax/)
- [CALCULATE – ฟังก์ชันหลักของ DAX ที่ควบคุม Filter Context](https://www.thepexcel.com/functions/dax/filter/calculate-dax/)
- [CALCULATETABLE – Evaluate Table Expression ใน Modified Filter Context](https://www.thepexcel.com/functions/dax/filter/calculatetable-dax/)
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)
- [SUMX – Iterator Function สำหรับคำนวณผลรวมแบบ Row-by-Row ใน DAX](https://www.thepexcel.com/functions/dax/aggregation/sumx-dax/)
- [COUNTROWS – นับจำนวนแถวในตารางและเทบิลเสมือน](https://www.thepexcel.com/functions/dax/aggregation/countrows-dax/)
- [VALUES – ดึงค่าที่ไม่ซ้ำจากคอลัมน์ (รวม Blank จากข้อผิดพลาดความสัมพันธ์)](https://www.thepexcel.com/functions/dax/table-manipulation/values-dax/)
- [USERELATIONSHIP – เลือกใช้ relationship ที่ไม่ใช่ active](https://www.thepexcel.com/functions/dax/relationship/userelationship-dax/)
- [CROSSFILTER – กำหนดทิศทางการกรองข้ามความสัมพันธ์ชั่วคราว](https://www.thepexcel.com/functions/dax/relationship/crossfilter-dax/)
- [ADDCOLUMNS – เพิ่มคอลัมน์คำนวณให้ตาราง](https://www.thepexcel.com/functions/dax/table-manipulation/addcolumns-dax/)

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

- [DAX Guide: RELATED](https://dax.guide/related/) _(documentation)_
- [Microsoft Learn: RELATED Function](https://learn.microsoft.com/en-us/dax/related-function-dax) _(documentation)_
- [SQLBI: Using RELATED and RELATEDTABLE in DAX](https://www.sqlbi.com/articles/using-related-and-relatedtable-in-dax/) _(guide)_
- [DAX Guide: RELATEDTABLE](https://dax.guide/relatedtable/) _(documentation)_
- [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/relationship/related-dax/](https://www.thepexcel.com/functions/dax/relationship/related-dax/)_
