---
title: INTERSECT – หาส่วนร่วมของสองตาราง
url: https://www.thepexcel.com/functions/dax/table-manipulation/intersect-dax/
type: function-explainer
program: DAX
syntax: "INTERSECT(<LeftTable>, <RightTable>)"
date: 2025-12-13
updated: 2025-12-25
scores:
  popularity: 5
  difficulty: 4
  usefulness: 5
---

# INTERSECT – หาส่วนร่วมของสองตาราง

> INTERSECT คืนตารางของแถวที่อยู่ในทั้ง LeftTable และ RightTable เหมาะกับการหาสิ่งที่ซ้ำกัน/ร่วมกันระห

## คำอธิบาย

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

## Syntax

```excel
INTERSECT(&lt;LeftTable&gt;, &lt;RightTable&gt;)
```

**Variant**

```excel
INTERSECT(&lt;LeftTable&gt;, &lt;RightTable&gt;)
```

คืนแถวที่อยู่ในทั้ง LeftTable และ RightTable

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| LeftTable | Yes | table |  | ตารางฝั่งซ้าย (ผลลัพธ์จะเก็บชื่อคอลัมน์และ lineage จากตารางนี้) |
| RightTable | Yes | table |  | ตารางฝั่งขวา (ใช้เพื่อเทียบว่าแถวใดอยู่ในตารางนี้ด้วย) |

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

### หาสินค้าที่อยู่ในทั้งยอดขายและคืนสินค้า

เช่น เทียบ ProductID จากสองตาราง

_เหมาะกับ:_ products-in-both

### หาลูกค้าที่อยู่ในทั้งสองชุดข้อมูล

เช่น ลูกค้าที่อยู่ในทั้งแคมเปญ A และ B

_เหมาะกับ:_ customers-in-both

## ตัวอย่าง

### 1. หาลูกค้าที่อยู่ในทั้งสองโปรแกรม

```excel
Customers in Both Programs =
VAR ProgACustomers = VALUES( ProgramA[CustomerID] )
VAR ProgBCustomers = VALUES( ProgramB[CustomerID] )
RETURN
  INTERSECT( ProgACustomers, ProgBCustomers )
```

**ผลลัพธ์:** `ตารางของ CustomerID ที่ปรากฏในทั้ง ProgramA และ ProgramB`

ใช้ VALUES เพื่อสร้างชุดลูกค้าจากแต่ละโปรแกรม แล้ว INTERSECT หาส่วนร่วม ผลลัพธ์คือลูกค้าที่เป็น overlap ระหว่างสองระบบ

### 2. หาสินค้าที่มีการขายและคืนกลับ

```excel
Products Sold and Returned =
VAR SoldProducts = VALUES( Sales[ProductID] )
VAR ReturnedProducts = VALUES( Returns[ProductID] )
RETURN
  INTERSECT( SoldProducts, ReturnedProducts )
```

**ผลลัพธ์:** `ตารางของ ProductID ที่มีการขายและมีการคืนกลับ`

INTERSECT ช่วยหาสินค้าที่ "ปรากฏในทั้งสองตาราง" เป็นวิธีที่เร็วกว่าการใช้ FILTER ที่ซ้อน

### 3. ตัวอย่างเปรียบเทียบกับ EXCEPT

```excel
Customers Only in Program A =
VAR ProgACustomers = VALUES( ProgramA[CustomerID] )
VAR ProgBCustomers = VALUES( ProgramB[CustomerID] )
RETURN
  EXCEPT( ProgACustomers, ProgBCustomers )
```

**ผลลัพธ์:** `ตารางของลูกค้าที่อยู่ใน Program A แต่ไม่อยู่ใน Program B`

INTERSECT หาส่วนร่วม แต่ EXCEPT หาส่วนที่อยู่ในชุดแรกแต่ไม่อยู่ในชุดที่สอง ใช้เมื่อต้องการหา "ส่วนแตกต่าง" แทน

### 4. เปรียบเทียบกับ UNION

```excel
All Customers from Both Programs =
VAR ProgACustomers = VALUES( ProgramA[CustomerID] )
VAR ProgBCustomers = VALUES( ProgramB[CustomerID] )
RETURN
  UNION( ProgACustomers, ProgBCustomers )
```

**ผลลัพธ์:** `ตารางของลูกค้าทั้งหมดจากทั้งสองโปรแกรม (รวมกัน)`

UNION รวม "ทั้งหมด" จากสองตาราง ส่วน INTERSECT หาแต่ "ส่วนร่วม" เลือกใช้ตามความต้องการ

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

- ผมแนะนำให้ใช้ SELECTCOLUMNS หรือ VALUES ก่อน INTERSECT เพื่อให้แน่ใจว่ากำลังเทียบคอลัมน์ที่ถูกต้อง และลดจำนวนแถวก่อน ซึ่งเพิ่มประสิทธิภาพด้วย

- ถ้าต้องการเอาแถวที่ซ้ำออก ให้ห่อ INTERSECT ด้วย DISTINCT เช่น DISTINCT( INTERSECT(...) )

- ส่วนตัวผม มักใช้ INTERSECT กับ VALUES เพื่อหาเลขที่หรือรหัสที่ "ปรากฏในทั้งสอง" แล้วค่อยใช้ผลลัพธ์ใน CALCULATE เพื่อบังคับ filter

- ระวัง lineage นะครับ INTERSECT ข้อมูลหลัก (ตัวแรก) มีผลต่อการทำงานของความสัมพันธ์โมเดล ถ้าได้ผลลัพธ์ไม่ตรงที่คิด ลองสลับลำดับของตารางดู

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

**Q: INTERSECT แตกต่างจาก EXCEPT อย่างไร?**

INTERSECT หาแถวที่อยู่ "ในทั้งสอง" ส่วน EXCEPT หาแถวที่อยู่ "ในแรกแต่ไม่อยู่ในที่สอง" ตัวอย่าง: ถ้า A = {1,2,3} และ B = {2,3,4} แล้ว INTERSECT(A,B) = {2,3} ส่วน EXCEPT(A,B) = {1}

**Q: INTERSECT ต่างจาก UNION อย่างไร?**

UNION รวม "ทั้งหมด" จากสองตาราง (คล้ายการรวมเซต) ส่วน INTERSECT หาแต่ "ส่วนร่วม" (คล้ายจุดตัดเซต) UNION(A,B) = {1,2,3,4} ส่วน INTERSECT(A,B) = {2,3}

**Q: INTERSECT เป็น commutative ไหม? (มีความสมมาตร)**

ไม่ครับ INTERSECT(A, B) อาจให้ผลต่างจาก INTERSECT(B, A) เพราะมันรักษาชื่อคอลัมน์และ lineage จาก LeftTable เท่านั้น ถ้าตาราง A มีแถวซ้ำ แล้ว INTERSECT(A, B) จะเก็บแถวซ้ำนั้นไว้ ส่วน INTERSECT(B, A) จะเก็บแถวซ้ำจาก B

**Q: INTERSECT รักษาแถวที่ซ้ำกันไหม?**

ใช่ INTERSECT รักษา "แถวที่ซ้ำจาก LeftTable" ถ้า LeftTable มีแถว {A, A, B} และ RightTable มี {A, B, C} ผลลัพธ์คือ {A, A, B} ไม่ใช่ {A, B} ถ้าต้องการลบแถวซ้ำ ให้ใช้ DISTINCT ห่อ INTERSECT ไว้

**Q: ตารางสองฝั่งต้องมีโครงสร้างเหมือนกันไหม?**

ควรมีคอลัมน์ที่สอดคล้องกัน (เทียบจำนวน ชนิด และลำดับ) เพราะ INTERSECT เทียบแถวตามตำแหน่งของคอลัมน์ไม่ใช่ชื่อ ถ้าต้องการเทียบเฉพาะบางคอลัมน์ ให้เตรียมตารางด้วย SELECTCOLUMNS ก่อน

**Q: INTERSECT ใช้ได้กับ DirectQuery ไหม?**

ไม่ครับ INTERSECT ไม่ support DirectQuery mode โดยเฉพาะสำหรับ calculated column และ row-level security rules ต้องใช้ Import mode หรือ Dual mode

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

- except
- union
- values
- distinct
- selectcolumns
- [FILTER – กรองตารางด้วยเงื่อนไขที่ซับซ้อน (Iterator Function)](https://www.thepexcel.com/functions/dax/filter/filter-dax/)
- treatas

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

- [DAX Guide: INTERSECT](https://dax.guide/intersect/) _(guide)_
- [Microsoft Docs: INTERSECT (DAX)](https://learn.microsoft.com/en-us/dax/intersect-function-dax) _(official)_

---

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