Thep Excel

CROSSJOINสร้างตารางผลคูณคาร์ทีเซียน (Cartesian Product)

CROSSJOIN สร้างตารางใหม่โดยการรวมแถวทั้งหมดจากตารางที่ระบุ โดยสร้างทุก Combination ที่เป็นไปได้ ผลลัพธ์คือตารางที่มีจำนวนแถวเท่ากับผลคูณของจำนวนแถวของแต่ละตาราง

fx
=CROSSJOIN(<table1>, <table2>[, <table3>]…)

ความนิยม5/10
ความยาก5/10
ประโยชน์5/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด ค่าเริ่มต้น คำอธิบาย
table1 Table ตารางตัวแรกที่ต้องการนำมาสร้าง Combination นี่คือตารางใดก็ได้ที่ส่งกลับมาจากนิพจน์ DAX (เช่น VALUES, SUMMARIZE, DATATABLE เป็นต้น)
table2 Table ตารางตัวที่สองที่ต้องการนำมาสร้างผลคูณคาร์ทีเซียน ชื่อคอลัมน์ต้องไม่ซ้ำกับตาราง table1
[table3]ไม่บังคับ Table ไม่มีตารางเพิ่มเติม ตารางตัวที่สาม ห้า หรือมากกว่า (ทำซ้ำได้ตามต้องการ) สำหรับการสร้าง Combination ของตารางมากกว่า 2 ตาราง

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

CROSSJOIN เป็นฟังก์ชันที่สร้าง ผลคูณคาร์ทีเซียน (Cartesian Product) ของแถวทั้งหมดจากสองตารางหรือมากกว่านั้น ผลลัพธ์คือตารางใหม่ที่มีทุก Combination ที่เป็นไปได้ของแถวจากตารางต้นฉบับ

เช่น ถ้า Table A มี 3 แถว และ Table B มี 4 แถว CROSSJOIN(Table A, Table B) จะได้ตารางใหม่ที่มี 3 x 4 = 12 แถว

จำนวนแถวผลลัพธ์ = (แถวของตาราง 1) × (แถวของตาราง 2) × (แถวของตาราง 3) …
จำนวนคอลัมน์ผลลัพธ์ = (คอลัมน์ของตาราง 1) + (คอลัมน์ของตาราง 2) + (คอลัมน์ของตาราง 3) …

How it works

การสร้างตาราง Matrix สำหรับการวิเคราะห์ (What-If Analysis)

เช่น ต้องการสร้างตารางทุก Combination ของ Product และ Scenario (Best/Worst Case) เพื่อวิเคราะห์ผลลัพธ์

การสร้างตารางจำลอง (Simulation Table)

สร้างตารางที่ใช้ในการทดสอบสูตรหรือโมเดลต่างๆ

Examples

ตัวอย่างที่ 1: รวม Product กับ Calendar YearProduct X Year = CROSSJOIN( VALUES('Product'[ProductName]), VALUES('Date'[CalendarYear]) )

ถ้ามี 10 สินค้า และ 5 ปี จะได้ตาราง 50 แถว แสดงทุก Combination ของสินค้าและปี นี่มีประโยชน์สำหรับการทำให้เห็นว่าสินค้าไหนที่ขายในปีไหนบ้าง และปีไหนที่ไม่มีการขาย

fx
Product X Year = CROSSJOIN( VALUES('Product'[ProductName]), VALUES('Date'[CalendarYear]) )

ผลลัพธ์ตารางที่มีทุกชื่อสินค้าคู่กับทุกปีที่มีข้อมูล
ตัวอย่างที่ 2: หา Combination ที่ไม่มีขาย (Missing Sales)Missing Combinations = EXCEPT( CROSSJOIN( VALUES(Store[StoreName]), VALUES(Product[ProductName]) ), SUMMARIZE(Sales, Store[StoreName], Product[ProductName]) )

สร้างตารางที่เป็นไปได้ทั้งหมด (CROSSJOIN) แล้วลบด้วยตารางที่มีขายจริง (SUMMARIZE) เพื่อหาช่องว่าง เช่น ถ้ามี 5 ร้านค้า และ 8 สินค้า ควรจะมี 40 Combination แต่ถ้าขายจริงมีแค่ 35 แถว แสดงว่ามี 5 Combination ที่ไม่มีขายอยู่

fx
Missing Combinations =
EXCEPT(
CROSSJOIN(
VALUES(Store[StoreName]),
VALUES(Product[ProductName])
),
SUMMARIZE(Sales, Store[StoreName], Product[ProductName])
)

ผลลัพธ์ตาราง Store และ Product ที่ไม่มียอดขาย
ตัวอย่างที่ 3: สร้างตารางไพ่ (52 ใบ)Deck of Cards = CROSSJOIN( DATATABLE("Suit", STRING, {{"Heart"}, {"Diamond"}, {"Spade"}, {"Club"}}), DATATABLE("Rank", STRING, { {"A"}, {"2"}, {"3"}, {"4"}, {"5…

รวม 4 ดอก x 13 แต้ม ได้ 52 ใบ ตัวอย่างนี้แสดงให้เห็นว่า CROSSJOIN ใช้สร้างชุดข้อมูล synthetic ที่ครอบคลุมทุก Combination ที่เป็นไปได้

fx
Deck of Cards =
CROSSJOIN(
DATATABLE("Suit", STRING, {{"Heart"}, {"Diamond"}, {"Spade"}, {"Club"}}),
DATATABLE("Rank", STRING, { {"A"}, {"2"}, {"3"}, {"4"}, {"5"}, {"6"}, {"7"}, {"8"}, {"9"}, {"10"}, {"J"}, {"Q"}, {"K"}})
)

ผลลัพธ์ตารางไพ่ 52 ใบ
ตัวอย่างที่ 4: สร้างตารางราคาและปริมาณPrice Volume Matrix = CROSSJOIN( DATATABLE("Price", REAL, {{10}, {20}, {30}, {40}}), DATATABLE("Volume", INTEGER, {{100}, {200}, {300}, {400}, {500}}) )

4 ระดับราคา × 5 ระดับปริมาณ = 20 แถว ใช้ประโยชน์เมื่อต้องการวิเคราะห์สถานการณ์ที่เป็นไปได้ทั้งหมด (Scenario Analysis)

fx
Price Volume Matrix =
CROSSJOIN(
DATATABLE("Price", REAL, {{10}, {20}, {30}, {40}}),
DATATABLE("Volume", INTEGER, {{100}, {200}, {300}, {400}, {500}})
)

ผลลัพธ์ตารางแสดง 20 Combination ของ Price x Volume

FAQs

CROSSJOIN ต่างจาก NATURALINNERJOIN หรือ NATURALLEFTOUTERJOIN อย่างไร?+

CROSSJOIN ไม่สนใจ Relationship หรือคอลัมน์ที่ตรงกัน มันจะสร้างทุก Combination ของแถวทั้งหมดโดยไม่คำนึงถึงค่าใดๆ ส่วน NATURAL…JOIN จะรวมตารางโดยอาศัยคอลัมน์ที่ชื่อตรงกัน และความสัมพันธ์ (Relationship) ของตารางในโมเดล

ควรหลีกเลี่ยง CROSSJOIN ตอนไหน?+

ควรหลีกเลี่ยงการใช้กับตารางขนาดใหญ่มากๆ เพราะจำนวนแถวจะเพิ่มขึ้นแบบทวีคูณ (เช่น ตาราง A มี 1 ล้านแถว, ตาราง B มี 1 ล้านแถว -> CROSSJOIN จะได้ 1 ล้านล้านแถว) ทำให้ Memory เต็มได้ง่ายและประสิทธิภาพลดลงอย่างมาก

ชื่อคอลัมน์ซ้ำกันระหว่างตารางจะเกิดอะไร?+

CROSSJOIN จะส่งข้อผิดพลาด (Error) หากชื่อคอลัมน์ซ้ำกัน ต้องใช้ ADDCOLUMNS หรือ SELECT เพื่อเปลี่ยนชื่อคอลัมน์ก่อนใช้ CROSSJOIN

CROSSJOIN กับ GENERATE ต่างกันอย่างไร?+

CROSSJOIN สร้างผลคูณโดยไม่มีเงื่อนไข ส่วน GENERATE สามารถสร้าง Combination ตามเงื่อนไข (เช่น ใช้ CALCULATE เพื่อกรอง) ทำให้ GENERATE มีประสิทธิภาพดีกว่าเมื่อต้องการเลือก Combination บางส่วน

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ CROSSJOIN จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้CROSSJOINTable manipulation
Table manipulation (9)
ADDCOLUMNS

ADDCOLUMNS เป็นฟังก์ชัน table transformation ที่ใช้สำหรับเพิ่มคอลัมน์ใหม่ (Calculated Columns) เข้าไปในตารางที่มีอยู่เดิม โดยคำนวณค่าในแต่ละแถวผ่าน Row Context และส่งคืนตารางเดิมพร้อมคอลัมน์ใหม่ต่อท้าย

DATATABLE

DATATABLE สร้างตารางแบบ hardcode ด้วยข้อมูลคงที่ โดยระบุชื่อคอลัมน์ ชนิดข้อมูล และค่าของแต่ละแถว เหมาะสำหรับตารางอ้างอิงเล็กๆ เช่น lookup table หรือข้อมูลตัวอย่าง

EXCEPT

EXCEPT คืนตารางของแถวที่อยู่ใน LeftTable แต่ไม่อยู่ใน RightTable เหมาะกับการหาสิ่งที่ขาดหาย เช่น สินค้าที่ไม่เคยขาย ลูกค้าที่ไม่มีธุรกรรม

GENERATE

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

GENERATEALL

GENERATEALL วนแถวของตาราง 1 แล้วสร้าง Cartesian product กับผลลัพธ์ของตาราง 2 โดยคงแถวที่ไม่มีข้อมูลย่อย ต่างจาก GENERATE ตรงที่ไม่ตัดแถวหลักออก

NATURALINNERJOIN

NATURALINNERJOIN ทำ inner join ระหว่าง LeftTable และ RightTable โดยใช้คอลัมน์ชื่อเดียวกันเป็นคีย์การจับคู่ คืนผลลัพธ์เฉพาะแถวที่จับคู่ได้ทั้งสองตาราง และมักใช้ร่วมกับ SELECTCOLUMNS เพื่อจัดชื่อคอลัมน์ให้ตรงกัน

NATURALLEFTOUTERJOIN

NATURALLEFTOUTERJOIN ทำ left outer join ระหว่าง LeftTable และ RightTable โดยใช้คอลัมน์ชื่อเดียวกันเป็นคีย์ เก็บทุกแถวของตารางซ้ายไว้ทั้งหมด และเติมคอลัมน์จากตารางขวาเมื่อจับคู่ได้ (ไม่จับคู่จะเป็น BLANK)

SUMMARIZE

SUMMARIZE สร้างตารางสรุปโดยจัดกลุ่มข้อมูลตามคอลัมน์ที่กำหนด คล้าย GROUP BY ใน SQL หรือ Pivot Table ใน Excel คืนค่าตารางที่มีหนึ่งแถวต่อหนึ่ง unique combination ของคอลัมน์ที่เลือก สามารถอ้างถึงคอลัมน์จาก related table ได้โดยตรงโดยไม่ต้องใช้ RELATED มักใช้สร้าง virtual table ใน measure เพื่อทำ intermediate calculations ก่อนใช้ iterator functions อย่าง SUMX, AVERAGEX คำนวณต่อ ⚠️ Best Practice: ใช้ ADDCOLUMNS ครอบ SUMMARIZE แทนการใส่ extension columns ตรงๆ เพื่อ performance และ filter context control ที่ดีกว่า สำหรับ calculated table แนะนำใช้ SUMMARIZECOLUMNS แทนเนื่องจากมี performance ดีกว่าอย่างมาก

VALUES

VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้

Filter (2)
CALCULATETABLE

CALCULATETABLE evaluate table expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน แล้วคืนค่าเป็น table (ตาราง) ซึ่งแตกต่างจาก CALCULATE ที่คืนค่าเป็น scalar value รองรับ filter arguments 3 รูปแบบ: Boolean expression, table expression, และ filter modifier functions (REMOVEFILTERS, ALL, KEEPFILTERS, USERELATIONSHIP, CROSSFILTER) มีพฤติกรรมเหมือน CALCULATE ในทุกแง่มุมของการจัดการ filter context รวมถึง context transition แต่เหมาะสำหรับการสร้าง intermediate table ที่ถูกกรองแล้วส่งต่อให้ iterator functions หรือใช้ใน calculated table มักมี performance ดีกว่า FILTER ใน simple filtering scenarios เพราะ DAX engine สามารถทำ cardinality estimation และ optimization ได้ดีกว่า

FILTER

FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่