---
title: CROSSJOIN – สร้างตารางผลคูณคาร์ทีเซียน (Cartesian Product)
url: https://www.thepexcel.com/functions/dax/table-manipulation/crossjoin-dax/
type: function-explainer
program: DAX
syntax: "CROSSJOIN(<table1>, <table2>[, <table3>]...)"
date: 2025-12-13
updated: 2025-12-24
scores:
  popularity: 5
  difficulty: 5
  usefulness: 5
---

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

> CROSSJOIN สร้างตารางใหม่โดยการรวมแถวทั้งหมดจากตารางที่ระบุ โดยสร้างทุก Combination ที่เป็นไปได้ ผลลั

## คำอธิบาย

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

## Syntax

```excel
CROSSJOIN(&lt;table1&gt;, &lt;table2&gt;[, &lt;table3&gt;]...)
```

**Variant**

```excel
CROSSJOIN(&lt;table1&gt;, &lt;table2&gt;)
```

สร้างตารางผลคูณคาร์ทีเซียนจาก 2 ตาราง (ทุกแถวของตารางแรกจับคู่กับทุกแถวของตารางที่สอง)

**Variant**

```excel
CROSSJOIN(&lt;table1&gt;, &lt;table2&gt;, &lt;table3&gt;, ...)
```

สร้างทุก Combination จากหลายตาราง (จำนวนแถวจะเติบโตแบบทวีคูณ จึงต้องระวังประสิทธิภาพ)

## Arguments

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

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

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

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

_เหมาะกับ:_ scenario-planning

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

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

_เหมาะกับ:_ data-simulation

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: รวม Product กับ Calendar Year

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

**ผลลัพธ์:** `ตารางที่มีทุกชื่อสินค้าคู่กับทุกปีที่มีข้อมูล`

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

### 2. ตัวอย่างที่ 2: หา Combination ที่ไม่มีขาย (Missing Sales)

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

**ผลลัพธ์:** `ตาราง Store และ Product ที่ไม่มียอดขาย`

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

### 3. ตัวอย่างที่ 3: สร้างตารางไพ่ (52 ใบ)

```excel
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 ดอก x 13 แต้ม ได้ 52 ใบ ตัวอย่างนี้แสดงให้เห็นว่า CROSSJOIN ใช้สร้างชุดข้อมูล synthetic ที่ครอบคลุมทุก Combination ที่เป็นไปได้

### 4. ตัวอย่างที่ 4: สร้างตารางราคาและปริมาณ

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

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

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

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

- เป็นฟังก์ชันที่ทรงพลัง แต่ต้องใช้อย่างระมัดระวังเป็นพิเศษ เนื่องจากสามารถสร้างตารางที่มีขนาดใหญ่เกินควบคุมได้อย่างรวดเร็ว

- หากตัวเลขสินค้า 100 ตัว คูณ 100 ปี = 10,000 แถว นี่ยังโอเค แต่ 10,000 สินค้า คูณ 10,000 ปี = 100 ล้านแถว = ปัญหาใหญ่

- พิจารณาใช้ GENERATE แทนเมื่อต้องการผลคูณแบบมีเงื่อนไข

- ใช้ร่วมกับ EXCEPT และ INTERSECT เพื่อหา Missing Data และ Overlapping Data

- CROSSJOIN ส่งกลับตารางเท่านั้น ไม่สามารถใช้เพื่อเรียงลำดับ หรือ Filter ตรง ต้องใช้ FILTER หรือ CALCULATETABLE ถ้าต้องกรอง

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

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

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

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

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

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

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

**Q: CROSSJOIN กับ GENERATE ต่างกันอย่างไร?**

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

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

- summarize
- values
- datatable
- except
- naturalinnerjoin
- naturalleftouterjoin
- rank-dax

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

- [DAX Guide: CROSSJOIN](https://dax.guide/crossjoin/) _(guide)_
- [Microsoft Learn: CROSSJOIN Function](https://learn.microsoft.com/en-us/dax/crossjoin-function-dax) _(official)_
- [DAX Patterns: Many-to-Many Relationships](https://www.daxpatterns.com/) _(article)_

---

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