GENERATE วนทีละแถวใน Table1 แล้วประเมิน Table2 ตามบริบทของแถวนั้น จากนั้นนำผลของทุกแถวมารวมเป็นตารางเดียว เหมาะกับงานสร้างตารางแบบขยาย/ตารางลูกตามแถวของตารางแม่
=GENERATE(<Table1>, <Table2>)
=GENERATE(<Table1>, <Table2>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Table1 | table | Yes | ตารางหลักที่ใช้วนทีละแถว | |
| Table2 | table | Yes | นิพจน์ตารางที่ถูกประเมินต่อแถวของ Table1 แล้วนำผลมารวมกัน |
เช่น สร้างแถวรายละเอียดตามแต่ละรายการในตารางหลัก
เหมาะกับการสร้างตารางคำนวณที่ต้องประกอบจากหลายส่วน
Expanded = GENERATE( Products, FILTER(Sales, Sales[ProductID] = Products[ProductID]) )Expanded =
GENERATE(
Products,
FILTER(Sales, Sales[ProductID] = Products[ProductID])
)
ได้ตารางที่รวมแถวของ Sales ที่ตรงกับแต่ละสินค้า
Product with Levels (Concept) = GENERATE( VALUES(Products[ProductID]), ADDCOLUMNS( GENERATESERIES(1, 3), "Level", [Value] ) )=Product with Levels (Concept) =
GENERATE(
VALUES(Products[ProductID]),
ADDCOLUMNS(
GENERATESERIES(1, 3),
"Level", [Value]
)
)
ได้ตารางที่มี ProductID ซ้ำ 3 แถวต่อสินค้า พร้อมคอลัมน์ Level
Expanded (Keep Empty) = GENERATEALL( Products, FILTER(Sales, Sales[ProductID] = Products[ProductID]) )=Expanded (Keep Empty) =
GENERATEALL(
Products,
FILTER(Sales, Sales[ProductID] = Products[ProductID])
)
เก็บแถวของ Products แม้ไม่มี Sales ที่ตรง (ขึ้นกับ Table2 ที่คืนมา)
ทั้งคู่เป็นการวน Table1 แล้วรวมผลของ Table2 แต่ GENERATEALL มักใช้เมื่ออยากคงผลลัพธ์ที่รวมกรณีที่ Table2 ว่าง/ไม่มีแถวไว้ด้วย (รายละเอียดขึ้นกับรูปแบบที่ใช้)
แนวคิดคล้ายการขยายแถว แต่ GENERATE ประเมิน Table2 ต่อแถวตามบริบท ทำให้ยืดหยุ่นกว่า CROSSJOIN ที่เป็นการคูณแถวตรง ๆ
GENERATE เป็นฟังก์ชันแบบ table iterator: มันจะวนทีละแถวใน Table1 แล้วประเมิน Table2 ในบริบทของแถวนั้น จากนั้นนำผลลัพธ์ของ Table2 มาต่อรวมกันเป็นตารางผลลัพธ์เดียว เหมาะกับการสร้างตารางแบบขยาย หรือสร้างตารางลูกจากตารางแม่โดยอิงค่าของแต่ละแถวในตารางแม่