CROSSJOIN สร้างตารางใหม่โดยการรวมแถวทั้งหมดจากตารางที่ระบุ โดยสร้างทุก Combination ที่เป็นไปได้ ผลลัพธ์คือตารางที่มีจำนวนแถวเท่ากับผลคูณของจำนวนแถวของแต่ละตาราง
=CROSSJOIN(<table1>, <table2>[, <table3>]...)
=CROSSJOIN(<table1>, <table2>[, <table3>]...)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| table1 | Table | Yes | ตารางตัวแรกที่ต้องการนำมาสร้าง Combination นี่คือตารางใดก็ได้ที่ส่งกลับมาจากนิพจน์ DAX (เช่น VALUES, SUMMARIZE, DATATABLE เป็นต้น) | |
| table2 | Table | Yes | ตารางตัวที่สองที่ต้องการนำมาสร้างผลคูณคาร์ทีเซียน ชื่อคอลัมน์ต้องไม่ซ้ำกับตาราง table1 | |
| table3 | Table | Optional | ไม่มีตารางเพิ่มเติม | ตารางตัวที่สาม ห้า หรือมากกว่า (ทำซ้ำได้ตามต้องการ) สำหรับการสร้าง Combination ของตารางมากกว่า 2 ตาราง |
เช่น ต้องการสร้างตารางทุก Combination ของ Product และ Scenario (Best/Worst Case) เพื่อวิเคราะห์ผลลัพธ์
สร้างตารางที่ใช้ในการทดสอบสูตรหรือโมเดลต่างๆ
Product X Year = CROSSJOIN( VALUES('Product'[ProductName]), VALUES('Date'[CalendarYear]) )Product X Year = CROSSJOIN( VALUES('Product'[ProductName]), VALUES('Date'[CalendarYear]) )
ตารางที่มีทุกชื่อสินค้าคู่กับทุกปีที่มีข้อมูล
Missing Combinations = EXCEPT( CROSSJOIN( VALUES(Store[StoreName]), VALUES(Product[ProductName]) ), SUMMARIZE(Sales, Store[StoreName], Product[ProductName]) )Missing Combinations =
EXCEPT(
CROSSJOIN(
VALUES(Store[StoreName]),
VALUES(Product[ProductName])
),
SUMMARIZE(Sales, Store[StoreName], Product[ProductName])
)
ตาราง Store และ Product ที่ไม่มียอดขาย
Deck of Cards = CROSSJOIN( DATATABLE("Suit", STRING, {{"Heart"}, {"Diamond"}, {"Spade"}, {"Club"}}), DATATABLE("Rank", STRING, { {"A"}, {"2"}, {"3"}, {"4"}, {"5…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 ใบ
Price Volume Matrix = CROSSJOIN( DATATABLE("Price", REAL, {{10}, {20}, {30}, {40}}), DATATABLE("Volume", INTEGER, {{100}, {200}, {300}, {400}, {500}}) )Price Volume Matrix =
CROSSJOIN(
DATATABLE("Price", REAL, {{10}, {20}, {30}, {40}}),
DATATABLE("Volume", INTEGER, {{100}, {200}, {300}, {400}, {500}})
)
ตารางแสดง 20 Combination ของ Price x Volume
CROSSJOIN ไม่สนใจ Relationship หรือคอลัมน์ที่ตรงกัน มันจะสร้างทุก Combination ของแถวทั้งหมดโดยไม่คำนึงถึงค่าใดๆ ส่วน NATURAL…JOIN จะรวมตารางโดยอาศัยคอลัมน์ที่ชื่อตรงกัน และความสัมพันธ์ (Relationship) ของตารางในโมเดล
ควรหลีกเลี่ยงการใช้กับตารางขนาดใหญ่มากๆ เพราะจำนวนแถวจะเพิ่มขึ้นแบบทวีคูณ (เช่น ตาราง A มี 1 ล้านแถว, ตาราง B มี 1 ล้านแถว -> CROSSJOIN จะได้ 1 ล้านล้านแถว) ทำให้ Memory เต็มได้ง่ายและประสิทธิภาพลดลงอย่างมาก
CROSSJOIN จะส่งข้อผิดพลาด (Error) หากชื่อคอลัมน์ซ้ำกัน ต้องใช้ ADDCOLUMNS หรือ SELECT เพื่อเปลี่ยนชื่อคอลัมน์ก่อนใช้ CROSSJOIN
CROSSJOIN สร้างผลคูณโดยไม่มีเงื่อนไข ส่วน GENERATE สามารถสร้าง Combination ตามเงื่อนไข (เช่น ใช้ CALCULATE เพื่อกรอง) ทำให้ GENERATE มีประสิทธิภาพดีกว่าเมื่อต้องการเลือก Combination บางส่วน
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) …