Thep Excel

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

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

fx
=INTERSECT(<LeftTable>, <RightTable>)

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

อัปเดต 13 December 2025

Syntax & Arguments

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

Additional Notes

INTERSECT เป็นฟังก์ชันที่หา “ส่วนร่วม” ของสองตารางเหมือนการหาจุดตัดของเซตในคณิตศาสตร์ มันคืนแถวทั้งหมดที่ปรากฏในทั้ง LeftTable และ RightTable โดยรักษาแถวที่ซ้ำกันจาก LeftTable ไว้ด้วย

ที่เจ๋งคือ INTERSECT ไม่ใช่ commutative – ถ้าสลับตาราง ผลลัพธ์จะต่างออกไป เพราะมันรักษาชื่อคอลัมน์และ lineage จาก LeftTable ทำให้เหมาะกับการตรวจสอบ “ลูกค้าที่อยู่ในทั้งสองระบบ” หรือ “สินค้าที่มีการขายและคืนกลับ” ในข้อมูลจริง

ส่วนตัวผมใช้ INTERSECT เมื่อต้องการหา overlap ระหว่างสองชุดข้อมูล โดยเฉพาะสำหรับการวิเคราะห์ “สิ่งที่ร่วมกัน” ไม่ว่าจะเป็นลูกค้า สินค้า หรือการ์ด membership ผมมักจับคู่ INTERSECT กับ VALUES หรือ SELECTCOLUMNS เพื่อให้ได้ผลลัพธ์ที่ชัดเจนครับ

How it works

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

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

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

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

Examples

หาลูกค้าที่อยู่ในทั้งสองโปรแกรมCustomers in Both Programs = VAR ProgACustomers = VALUES( ProgramA[CustomerID] ) VAR ProgBCustomers = VALUES( ProgramB[CustomerID] ) RETURN INTERSECT( ProgACust…

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

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

ผลลัพธ์ตารางของ CustomerID ที่ปรากฏในทั้ง ProgramA และ ProgramB
หาสินค้าที่มีการขายและคืนกลับProducts Sold and Returned = VAR SoldProducts = VALUES( Sales[ProductID] ) VAR ReturnedProducts = VALUES( Returns[ProductID] ) RETURN INTERSECT( SoldProducts, R…

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

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

ผลลัพธ์ตารางของ ProductID ที่มีการขายและมีการคืนกลับ
ตัวอย่างเปรียบเทียบกับ EXCEPTCustomers Only in Program A = VAR ProgACustomers = VALUES( ProgramA[CustomerID] ) VAR ProgBCustomers = VALUES( ProgramB[CustomerID] ) RETURN EXCEPT( ProgACustom…

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

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

ผลลัพธ์ตารางของลูกค้าที่อยู่ใน Program A แต่ไม่อยู่ใน Program B
เปรียบเทียบกับ UNIONAll Customers from Both Programs = VAR ProgACustomers = VALUES( ProgramA[CustomerID] ) VAR ProgBCustomers = VALUES( ProgramB[CustomerID] ) RETURN UNION( ProgACu…

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

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

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

FAQs

INTERSECT แตกต่างจาก EXCEPT อย่างไร?+

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

INTERSECT ต่างจาก UNION อย่างไร?+

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

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

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

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

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

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

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

INTERSECT ใช้ได้กับ DirectQuery ไหม?+

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

Resources & Related

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

ฟังก์ชันนี้INTERSECTTable manipulation
Table manipulation (6)
DISTINCT

DISTINCT คืนค่าตารางที่มีคอลัมน์เดียว ซึ่งประกอบด้วยค่าที่ไม่ซ้ำกันจากคอลัมน์ที่ระบุ โดยไม่รวม Blank Row ที่เกิดจาก Invalid Relationship ความแตกต่างหลักจาก VALUES คือ DISTINCT จะซ่อน Data Quality Issues ในขณะที่ VALUES จะเตือนให้เห็น

EXCEPT

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

SELECTCOLUMNS

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

TREATAS

TREATAS เป็นเสมือนการสร้าง "virtual relationship" โดยไม่ต้องแก้โมเดล ช่วยให้ส่งเงื่อนไขข้ามตารางที่ไม่เชื่อมกัน หรือเมื่อต้องการส่งหลายคีย์พร้อมกัน

UNION

UNION รวมหลายตารางให้เป็นตารางเดียวด้วยการต่อแถว โดยเก็บแถวซ้ำไว้ทั้งหมด เหมาะกับการรวมชุดข้อมูลที่มีโครงสร้างคอลัมน์สอดคล้องกัน

VALUES

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

Information (1)
CONTAINS

CONTAINS ค้นหาแถวในตารางและคืนค่า TRUE/FALSE เมื่อหาเจอค่าที่ตรงกับเงื่อนไขที่กำหนด เจ๋งเพราะมันเร็วกว่า COUNTROWS + FILTER มาก

Comments

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