Thep Excel

EXCEPTหาผลต่างของตาราง (อยู่ในซ้ายแต่ไม่อยู่ในขวา)

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

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

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

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
LeftTable table ตารางฝั่งซ้าย (ชุดหลักที่เป็นฐาน) โดยทั่วไปใช้ VALUES() หรือ FILTER() ที่ได้จากตารางหลักอย่าง Products หรือ Customers
RightTable table ตารางฝั่งขวา (ชุดที่ต้องการตัดออก) โดยทั่วไปคือข้อมูลที่เกิดจริง เช่น VALUES(Sales[ProductID]) ที่บอกว่า “สินค้าไหนที่มีการขาย”

Additional Notes

EXCEPT เป็นฟังก์ชันเซตข้อมูล (set operation) ที่ใช้หา “ผลต่าง” ระหว่างสองตาราง คืนแถวทั้งหมดที่อยู่ในตารางฝั่งซ้าย แต่ไม่พบในตารางฝั่งขวา เหมือนแนวคิด A – B ในเซต คอลัมน์จะเทียบกันตามตำแหน่ง (position) ไม่ใช่ชื่อ

ที่เจ๋งคือ EXCEPT ทำให้หาข้อมูลที่ “ขาดหาย” ได้ง่าย เช่น รายชื่อสินค้าที่ไม่เคยขาย รายชื่อลูกค้าที่ไม่มีธุรกรรมในปีนี้ หรือเอกสารที่รออนุมัติ ทั้งหมดเหล่านี้เป็นการลบชุดข้อมูลออก มันจะช่วยเวลาหาข้อมูลที่หายไป

ส่วนตัวผมชอบใช้ EXCEPT เมื่อต้องการตรวจสอบ “ความสมบูรณ์” ของข้อมูล เช่น มีสินค้ากี่ชิ้นที่ยังไม่เคยขาย ลูกค้าที่ลืมทำการขายไป การใช้ EXCEPT + COUNTROWS ช่วยให้รู้ว่าขาดไปเท่าไหร่

How it works

หาสินค้าที่ไม่เคยขาย

เอารายการสินค้าทั้งหมด ลบด้วยรายการสินค้าที่เคยปรากฏในยอดขาย

หาลูกค้าที่ไม่มีธุรกรรม

เทียบรายชื่อลูกค้ากับรายชื่อลูกค้าที่ปรากฏในตารางขาย

Examples

ตัวอย่างที่ 1: สินค้าที่ไม่เคยขายVAR AllProducts = VALUES(Products[ProductID]) VAR ProductsSold = VALUES(Sales[ProductID]) RETURN EXCEPT(AllProducts, ProductsSold)

ขั้นแรก สร้าง AllProducts จากตาราง Products ได้ทุกสินค้า ขั้นที่สอง สร้าง ProductsSold จากตาราง Sales ได้สินค้าที่มีการขายจริง ขั้นที่สาม ใช้ EXCEPT ลบ ProductsSold ออกจาก AllProducts ได้สินค้าที่หายไป

fx
VAR AllProducts = VALUES(Products[ProductID])
VAR ProductsSold = VALUES(Sales[ProductID])
RETURN
EXCEPT(AllProducts, ProductsSold)

ผลลัพธ์ได้รายการ ProductID ของสินค้าทั้งหมดที่อยู่ในตาราง Products แต่ไม่พบในยอดขาย
ตัวอย่างที่ 2: ลูกค้าที่ไม่มีรายการขายในเดือนนี้VAR AllCustomers = VALUES(Customers[CustomerID]) VAR BuyersThisMonth = VALUES(FILTER(Sales, MONTH(Sales[Date]) = MONTH(TODAY()))) VAR BuyerCustomers = VALUES(Bu…

ใช้ FILTER กรองยอดขายของเดือนปัจจุบันก่อน แล้วดึงรายชื่อลูกค้าจากข้อมูลเบาะแสนั้น จากนั้นใช้ EXCEPT หาลูกค้าที่ยังไม่ปรากฏในฟิลเตอร์นั้น

fx
VAR AllCustomers = VALUES(Customers[CustomerID])
VAR BuyersThisMonth = VALUES(FILTER(Sales, MONTH(Sales[Date]) = MONTH(TODAY())))
VAR BuyerCustomers = VALUES(BuyersThisMonth[CustomerID])
RETURN
EXCEPT(AllCustomers, BuyerCustomers)

ผลลัพธ์ได้รายชื่อลูกค้าที่ไม่มีการเข้ามาซื้อในเดือนปัจจุบัน
ตัวอย่างที่ 3: เปรียบเทียบ EXCEPT กับ INTERSECTVAR LeftSet = {1, 2, 3, 4} VAR RightSet = {3, 4, 5, 6} VAR OnlyLeft = EXCEPT(LeftSet, RightSet) — ได้ {1, 2} VAR CommonBoth = INTERSECT(LeftSet, RightSet) — ไ…

EXCEPT = ซ้ายแต่ไม่อยู่ขวา / INTERSECT = อยู่ทั้งซ้ายและขวา / UNION = รวมทั้งสองฝั่ง เลือกใช้ตามสิ่งที่ต้องการหา

fx
VAR LeftSet = {1, 2, 3, 4}
VAR RightSet = {3, 4, 5, 6}
VAR OnlyLeft = EXCEPT(LeftSet, RightSet) — ได้ {1, 2}
VAR CommonBoth = INTERSECT(LeftSet, RightSet) — ได้ {3, 4}
VAR Combined = UNION(LeftSet, RightSet) — ได้ {1, 2, 3, 4, 5, 6}

ผลลัพธ์EXCEPT ได้ {1,2} / INTERSECT ได้ {3,4} / UNION ได้ {1,2,3,4,5,6}
ตัวอย่างที่ 4: นับสินค้าที่ไม่เคยขายCount of Unsold Products = VAR AllProducts = VALUES(Products[ProductID]) VAR ProductsSold = VALUES(Sales[ProductID]) RETURN COUNTROWS(EXCEPT(AllProducts, Produc…

ใช้ EXCEPT เพื่อหารายชื่อสินค้าที่ไม่เคยขาย แล้วค่อย COUNTROWS นับจำนวนแถว

fx
Count of Unsold Products =
VAR AllProducts = VALUES(Products[ProductID])
VAR ProductsSold = VALUES(Sales[ProductID])
RETURN
COUNTROWS(EXCEPT(AllProducts, ProductsSold))

ผลลัพธ์ตัวเลขแสดงจำนวนสินค้าที่ไม่เคยขาย

FAQs

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

EXCEPT = ซ้ายแต่ไม่อยู่ขวา / INTERSECT = อยู่ในทั้งซ้ายและขวา (ส่วนร่วม) / UNION = รวมทั้งซ้ายและขวาโดยลบของซ้ำ เลือกใช้ตามสิ่งที่หา ผมมักจำได้ว่า EXCEPT คือการลบเซต (difference) จึงใช้เมื่อต้องการหาสิ่งที่ "ขาดหาย"

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

จำนวนคอลัมน์ต้องเท่ากัน และเทียบตามตำแหน่ง (position) ไม่ใช่ชื่อ ชนิดข้อมูลควรเข้ากันได้ เพราะ DAX จะเทียบแถวตามค่าและชนิด เช่น ถ้า LeftTable มี 2 คอลัมน์ RightTable ก็ต้อง 2 คอลัมน์เหมือนกัน

ถ้าตารางซ้ายมีข้อมูลซ้ำ (duplicate) จะเกิดอะไร?+

ถ้า LeftTable มีแถวซ้ำกัน EXCEPT จะเก็บข้อมูลซ้ำนั้นไว้ หากแถวไม่พบใน RightTable เช่น LeftTable = {A, A, B} และ RightTable = {B} ผลลัพธ์จะเป็น {A, A} เพราะ A ทั้งสองแถวไม่พบใน RightTable

EXCEPT ทำงานบริบทอย่างไร (row context vs filter context)?+

EXCEPT ทำงานเป็น table function ที่ส่งคืน table ไม่ได้ทำการ context transition อัตโนมัติ บริบทที่สร้างตาราง LeftTable และ RightTable ต่างหากที่สำคัญ เช่น ใช้ VALUES() ซึ่งตัดออก row context แล้วสร้างเป็น filter context จึงต้อง VAR เก็บไว้ก่อน

ใช้ EXCEPT เพื่อเปรียบเทียบหลาย column ได้ไหม?+

ได้ เพียงแต่ต้องสร้าง table ที่มีคอลัมน์หลายตัว เช่น SELECTCOLUMNS ใช้เลือกคอลัมน์ A, B, C จากตัวตั้ง แล้ว EXCEPT จะเทียบแถวทั้ง 3 คอลัมน์พร้อมกัน

Resources & Related

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

ฟังก์ชันนี้EXCEPTTable manipulation
Table manipulation (7)
CROSSJOIN

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

DISTINCT

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

INTERSECT

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

SELECTCOLUMNS

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

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 ดีกว่าอย่างมาก

UNION

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

VALUES

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

Filter (1)
FILTER

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

Comments

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