---
title: GENERATE – วนแถวตารางแรก สร้างตารางเพิ่มเติมในแต่ละรอบ แล้วรวมผลทั้งหมด
url: https://www.thepexcel.com/functions/dax/table-manipulation/generate-dax/
type: function-explainer
program: DAX
syntax: "GENERATE(<Table1>, <Table2>)"
date: 2025-12-13
updated: 2025-12-24
scores:
  popularity: 5
  difficulty: 6
  usefulness: 5
---

# GENERATE – วนแถวตารางแรก สร้างตารางเพิ่มเติมในแต่ละรอบ แล้วรวมผลทั้งหมด

> GENERATE วนทีละแถวใน Table1 แล้วประเมิน Table2 ในบริบทของแถวนั้น (row context) จากนั้นรวมผลทั้งหมดเป

## คำอธิบาย

GENERATE วนทีละแถวใน Table1 แล้วประเมิน Table2 ในบริบทของแถวนั้น (row context) จากนั้นรวมผลทั้งหมดเป็นตารางเดียว ถ้า Table2 ว่างเปล่าในรอบไหน แถวนั้นจาก Table1 จะถูกตัดออก (ต่างจาก GENERATEALL)

## Syntax

```excel
GENERATE(&lt;Table1&gt;, &lt;Table2&gt;)
```

**Variant**

```excel
GENERATE(&lt;Table1&gt;, &lt;Table2&gt;)
```

รวมตารางโดยวนแถวของ Table1 แล้วประเมิน Table2 ต่อแถว

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| Table1 | Yes | table |  | ตารางหลักที่ใช้วนทีละแถว ทุกค่าในแถวปัจจุบันจะกลายเป็น row context เพื่อใช้อ้างอิงใน Table2 |
| Table2 | Yes | table |  | นิพจน์ตารางที่ถูกประเมินในบริบท (row context) ของแต่ละแถวใน Table1 แล้วนำผลมารวมกัน ถ้าผลว่างเปล่าในรอบไหน แถวจากนั้นจาก Table1 จะถูกตัดออก |

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

### ขยายตารางแม่ให้มีแถวย่อยตามเงื่อนไข

เช่น สร้างแถวรายละเอียดตามแต่ละรายการในตารางหลัก

_เหมาะกับ:_ expand-by-parent

### สร้างตารางจากการวนแถวและคืนตารางย่อย

เหมาะกับการสร้างตารางคำนวณที่ต้องประกอบจากหลายส่วน

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

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ขยายช่วงวันเป็นแถวเดี่ยว

```excel
DateList =
GENERATE(
    VALUES(DateRange[StartDate]),
    ADDCOLUMNS(
        GENERATESERIES([Value], [Value] + 10),
        "DayOffset", [Value]
    )
)
```

**ผลลัพธ์:** `ตารางที่มี StartDate ของแต่ละแถว พร้อมคอลัมน์ DayOffset 0–10 ต่อแต่ละ StartDate`

GENERATE วนแต่ละ StartDate แล้วสร้าง 11 แถว (offset 0–10) ผลลัพธ์คือ N×11 แถว

### 2. ตัวอย่างที่ 2: ดึงแถวลูกต่อแต่ละหมวดหมู่ (Unpivot Pattern)

```excel
CategoryWithProducts =
GENERATE(
    VALUES(Product[Category]),
    FILTER(
        Product,
        Product[Category] = EARLIER(Product[Category])
    )
)
```

**ผลลัพธ์:** `ตารางแสดงแต่ละหมวดหมู่พร้อมรายชื่อผลิตภัณฑ์ของหมวดนั้น`

วนหมวดหมู่แต่ละหมวด แล้วดึงผลิตภัณฑ์ที่ตรงกับหมวดนั้น EARLIER() ใช้อ้างอิงค่า row context

### 3. ตัวอย่างที่ 3: เปรียบเทียบ GENERATE กับ GENERATEALL

```excel
Without Empty = GENERATE(...)
With Empty = GENERATEALL(...)
```

**ผลลัพธ์:** `ถ้า Table2 คืนค่าว่าง: GENERATE ตัดแถวออก | GENERATEALL เก็บแถว (NULL ในคอลัมน์ Table2)`

GENERATE ≈ SQL CROSS APPLY (ลบแถวที่ไม่มีข้อมูลในเงื่อนไข) | GENERATEALL ≈ SQL OUTER APPLY (คงไว้)

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

- GENERATE วนแต่ละแถวจึงใช้เวลา หากต้องความเร็ว ลองใช้ CROSSJOIN หรือ SUMMARIZE แทน

- ใช้ VAR เพื่อจัดเก็บค่า row context ก่อนใช้งาน ช่วยให้โค้ดอ่านง่ายและหลีกเลี่ยงปัญหา context

- GENERATE + ADDCOLUMNS มีความหมาย: ขยายแถว และเพิ่มคอลัมน์ใหม่พร้อมกัน

- ถ้าต้อง unpivot ลองลำดับ: VALUES → GENERATE → ADDCOLUMNS/FILTER ได้ผลดี

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

**Q: ทำไม EARLIER() ถึงสำคัญใน GENERATE?**

เพราะว่า GENERATE ส่งผ่าน row context จากแต่ละแถวของ Table1 ลงไปใน Table2 ถ้าคุณใช้ [Column] โดยตรง DAX อาจสับสน ว่าหมายถึง Table1 หรือ Table2 ดังนั้น EARLIER([Column]) ช่วยบอก "หมายถึงค่าบริบทนอก (outer context) นั่น"

**Q: เมื่อไหร่ใช้ GENERATE เมื่อไหร่ใช้ CROSSJOIN?**

CROSSJOIN = ผลคูณคาร์ทีเซียน (ทั้งหมด ×ทั้งหมด) | GENERATE = คูณเฉพาะส่วนที่ Table2 คืนมา ให้บริบทจาก Table1 จึงยืดหยุ่นกว่า

**Q: GENERATE ใช้ได้กับ DirectQuery ไหม?**

ใช้ได้บ้างนี่: ✓ Measures | ✓ Visual calculations | ✗ Calculated columns / RLS rules ใน DirectQuery mode

**Q: ประสิทธิภาพของ GENERATE เป็นไงบ้าง?**

ระวังปริมาณแถว: ถ้า Table1 มี 1,000 แถว และ Table2 ได้ 100 แถวต่อแถว ผลลัพธ์คือ 100,000 แถว อย่าลืมชั่งปริมาณ

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

- generateall
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)
- values
- crossjoin
- addcolumns
- summarize
- generateseries

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

- [Microsoft Learn: GENERATE](https://learn.microsoft.com/en-us/dax/generate-function-dax) _(official)_
- [DAX Guide: GENERATE](https://dax.guide/generate/) _(guide)_

---

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