Thep Excel

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

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

=EXCEPT(<LeftTable>, <RightTable>)

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
5/10

Difficulty
4/10

Usefulness
5/10

Syntax & Arguments

=EXCEPT(<LeftTable>, <RightTable>)

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

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 ได้สินค้าที่หายไป
DAX Formula:

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

Result:

ได้รายการ ProductID ของสินค้าทั้งหมดที่อยู่ในตาราง Products แต่ไม่พบในยอดขาย

ตัวอย่างที่ 2: ลูกค้าที่ไม่มีรายการขายในเดือนนี้
VAR AllCustomers = VALUES(Customers[CustomerID]) VAR BuyersThisMonth = VALUES(FILTER(Sales, MONTH(Sales[Date]) = MONTH(TODAY()))) VAR BuyerCustomers = VALUES(Bu…
ใช้ FILTER กรองยอดขายของเดือนปัจจุบันก่อน แล้วดึงรายชื่อลูกค้าจากข้อมูลเบาะแสนั้น จากนั้นใช้ EXCEPT หาลูกค้าที่ยังไม่ปรากฏในฟิลเตอร์นั้น
DAX Formula:

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

Result:

ได้รายชื่อลูกค้าที่ไม่มีการเข้ามาซื้อในเดือนปัจจุบัน

ตัวอย่างที่ 3: เปรียบเทียบ EXCEPT กับ INTERSECT
VAR 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 = รวมทั้งสองฝั่ง เลือกใช้ตามสิ่งที่ต้องการหา
DAX Formula:

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}

Result:

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 นับจำนวนแถว
DAX Formula:

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

Result:

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

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

Additional Notes

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

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *