Thep Excel

GENERATE – รวมตารางด้วยการวนแถวของตารางแรกแล้วสร้างตารางที่สอง

GENERATE วนทีละแถวใน Table1 แล้วประเมิน Table2 ตามบริบทของแถวนั้น จากนั้นนำผลของทุกแถวมารวมเป็นตารางเดียว เหมาะกับงานสร้างตารางแบบขยาย/ตารางลูกตามแถวของตารางแม่

=GENERATE(<Table1>, <Table2>)

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
5/10

Difficulty
6/10

Usefulness
5/10

Syntax & Arguments

=GENERATE(<Table1>, <Table2>)

Argument Type Required Default Description
Table1 table Yes ตารางหลักที่ใช้วนทีละแถว
Table2 table Yes นิพจน์ตารางที่ถูกประเมินต่อแถวของ Table1 แล้วนำผลมารวมกัน

How it works

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

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

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

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

Examples

ตัวอย่างที่ 1: สร้างการจับคู่แบบขยาย (แนวคิด)
Expanded = GENERATE( Products, FILTER(Sales, Sales[ProductID] = Products[ProductID]) )
GENERATE วนทีละสินค้า แล้วดึงแถว Sales ที่ตรงกับสินค้านั้น จากนั้นรวมผลทุกสินค้ากลายเป็นตารางเดียว
DAX Formula:

Expanded =
GENERATE(
    Products,
    FILTER(Sales, Sales[ProductID] = Products[ProductID])
)

Result:

ได้ตารางที่รวมแถวของ Sales ที่ตรงกับแต่ละสินค้า

ตัวอย่างที่ 2: สร้างแถวซ้ำต่อรายการด้วยตัวเลขชุดเล็ก (แนวคิด)
Product with Levels (Concept) = GENERATE( VALUES(Products[ProductID]), ADDCOLUMNS( GENERATESERIES(1, 3), "Level", [Value] ) )
วนสินค้าแต่ละตัว แล้วสร้างตารางย่อย 1–3 จากนั้นรวมผลเป็นตารางเดียว เหมาะกับงานสร้างโครงสร้างช่วยหรือทดสอบ
DAX Formula:

=Product with Levels (Concept) =
GENERATE(
    VALUES(Products[ProductID]),
    ADDCOLUMNS(
        GENERATESERIES(1, 3),
        "Level", [Value]
    )
)

Result:

ได้ตารางที่มี ProductID ซ้ำ 3 แถวต่อสินค้า พร้อมคอลัมน์ Level

ตัวอย่างที่ 3: ใช้ GENERATEALL เมื่ออยากเก็บแถวที่ Table2 ว่าง
Expanded (Keep Empty) = GENERATEALL( Products, FILTER(Sales, Sales[ProductID] = Products[ProductID]) )
GENERATE จะตัดแถวที่ Table2 ว่างออก แต่ GENERATEALL มีพฤติกรรมต่างกันในกรณีนี้
DAX Formula:

=Expanded (Keep Empty) =
GENERATEALL(
    Products,
    FILTER(Sales, Sales[ProductID] = Products[ProductID])
)

Result:

เก็บแถวของ Products แม้ไม่มี Sales ที่ตรง (ขึ้นกับ Table2 ที่คืนมา)

FAQs

GENERATE ต่างจาก GENERATEALL อย่างไร?

ทั้งคู่เป็นการวน Table1 แล้วรวมผลของ Table2 แต่ GENERATEALL มักใช้เมื่ออยากคงผลลัพธ์ที่รวมกรณีที่ Table2 ว่าง/ไม่มีแถวไว้ด้วย (รายละเอียดขึ้นกับรูปแบบที่ใช้)

GENERATE คล้าย CROSSJOIN ไหม?

แนวคิดคล้ายการขยายแถว แต่ GENERATE ประเมิน Table2 ต่อแถวตามบริบท ทำให้ยืดหยุ่นกว่า CROSSJOIN ที่เป็นการคูณแถวตรง ๆ

Resources & Related

Additional Notes

GENERATE เป็นฟังก์ชันแบบ table iterator: มันจะวนทีละแถวใน Table1 แล้วประเมิน Table2 ในบริบทของแถวนั้น จากนั้นนำผลลัพธ์ของ Table2 มาต่อรวมกันเป็นตารางผลลัพธ์เดียว เหมาะกับการสร้างตารางแบบขยาย หรือสร้างตารางลูกจากตารางแม่โดยอิงค่าของแต่ละแถวในตารางแม่

Leave a Reply

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