EXCEPT คืนตารางของแถวที่อยู่ใน LeftTable แต่ไม่อยู่ใน RightTable เหมาะกับการหาสิ่งที่ขาดหาย เช่น สินค้าที่ไม่เคยขาย ลูกค้าที่ไม่มีธุรกรรม
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| LeftTable | table | ตารางฝั่งซ้าย (ชุดหลักที่เป็นฐาน) โดยทั่วไปใช้ VALUES() หรือ FILTER() ที่ได้จากตารางหลักอย่าง Products หรือ Customers |
| RightTable | table | ตารางฝั่งขวา (ชุดที่ต้องการตัดออก) โดยทั่วไปคือข้อมูลที่เกิดจริง เช่น VALUES(Sales[ProductID]) ที่บอกว่า “สินค้าไหนที่มีการขาย” |
EXCEPT เป็นฟังก์ชันเซตข้อมูล (set operation) ที่ใช้หา “ผลต่าง” ระหว่างสองตาราง คืนแถวทั้งหมดที่อยู่ในตารางฝั่งซ้าย แต่ไม่พบในตารางฝั่งขวา เหมือนแนวคิด A – B ในเซต คอลัมน์จะเทียบกันตามตำแหน่ง (position) ไม่ใช่ชื่อ
ที่เจ๋งคือ EXCEPT ทำให้หาข้อมูลที่ “ขาดหาย” ได้ง่าย เช่น รายชื่อสินค้าที่ไม่เคยขาย รายชื่อลูกค้าที่ไม่มีธุรกรรมในปีนี้ หรือเอกสารที่รออนุมัติ ทั้งหมดเหล่านี้เป็นการลบชุดข้อมูลออก มันจะช่วยเวลาหาข้อมูลที่หายไป
ส่วนตัวผมชอบใช้ EXCEPT เมื่อต้องการตรวจสอบ “ความสมบูรณ์” ของข้อมูล เช่น มีสินค้ากี่ชิ้นที่ยังไม่เคยขาย ลูกค้าที่ลืมทำการขายไป การใช้ EXCEPT + COUNTROWS ช่วยให้รู้ว่าขาดไปเท่าไหร่
เอารายการสินค้าทั้งหมด ลบด้วยรายการสินค้าที่เคยปรากฏในยอดขาย
เทียบรายชื่อลูกค้ากับรายชื่อลูกค้าที่ปรากฏในตารางขาย
ขั้นแรก สร้าง AllProducts จากตาราง Products ได้ทุกสินค้า ขั้นที่สอง สร้าง ProductsSold จากตาราง Sales ได้สินค้าที่มีการขายจริง ขั้นที่สาม ใช้ EXCEPT ลบ ProductsSold ออกจาก AllProducts ได้สินค้าที่หายไป
ใช้ FILTER กรองยอดขายของเดือนปัจจุบันก่อน แล้วดึงรายชื่อลูกค้าจากข้อมูลเบาะแสนั้น จากนั้นใช้ EXCEPT หาลูกค้าที่ยังไม่ปรากฏในฟิลเตอร์นั้น
EXCEPT = ซ้ายแต่ไม่อยู่ขวา / INTERSECT = อยู่ทั้งซ้ายและขวา / UNION = รวมทั้งสองฝั่ง เลือกใช้ตามสิ่งที่ต้องการหา
ใช้ EXCEPT เพื่อหารายชื่อสินค้าที่ไม่เคยขาย แล้วค่อย COUNTROWS นับจำนวนแถว
EXCEPT = ซ้ายแต่ไม่อยู่ขวา / INTERSECT = อยู่ในทั้งซ้ายและขวา (ส่วนร่วม) / UNION = รวมทั้งซ้ายและขวาโดยลบของซ้ำ เลือกใช้ตามสิ่งที่หา ผมมักจำได้ว่า EXCEPT คือการลบเซต (difference) จึงใช้เมื่อต้องการหาสิ่งที่ "ขาดหาย"
จำนวนคอลัมน์ต้องเท่ากัน และเทียบตามตำแหน่ง (position) ไม่ใช่ชื่อ ชนิดข้อมูลควรเข้ากันได้ เพราะ DAX จะเทียบแถวตามค่าและชนิด เช่น ถ้า LeftTable มี 2 คอลัมน์ RightTable ก็ต้อง 2 คอลัมน์เหมือนกัน
ถ้า LeftTable มีแถวซ้ำกัน EXCEPT จะเก็บข้อมูลซ้ำนั้นไว้ หากแถวไม่พบใน RightTable เช่น LeftTable = {A, A, B} และ RightTable = {B} ผลลัพธ์จะเป็น {A, A} เพราะ A ทั้งสองแถวไม่พบใน RightTable
EXCEPT ทำงานเป็น table function ที่ส่งคืน table ไม่ได้ทำการ context transition อัตโนมัติ บริบทที่สร้างตาราง LeftTable และ RightTable ต่างหากที่สำคัญ เช่น ใช้ VALUES() ซึ่งตัดออก row context แล้วสร้างเป็น filter context จึงต้อง VAR เก็บไว้ก่อน
ได้ เพียงแต่ต้องสร้าง table ที่มีคอลัมน์หลายตัว เช่น SELECTCOLUMNS ใช้เลือกคอลัมน์ A, B, C จากตัวตั้ง แล้ว EXCEPT จะเทียบแถวทั้ง 3 คอลัมน์พร้อมกัน
ฟังก์ชันที่ผู้เขียนโยงไว้กับ EXCEPT จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
CROSSJOIN สร้างตารางใหม่โดยการรวมแถวทั้งหมดจากตารางที่ระบุ โดยสร้างทุก Combination ที่เป็นไปได้ ผลลัพธ์คือตารางที่มีจำนวนแถวเท่ากับผลคูณของจำนวนแถวของแต่ละตาราง
DISTINCT คืนค่าตารางที่มีคอลัมน์เดียว ซึ่งประกอบด้วยค่าที่ไม่ซ้ำกันจากคอลัมน์ที่ระบุ โดยไม่รวม Blank Row ที่เกิดจาก Invalid Relationship ความแตกต่างหลักจาก VALUES คือ DISTINCT จะซ่อน Data Quality Issues ในขณะที่ VALUES จะเตือนให้เห็น
INTERSECT คืนตารางของแถวที่อยู่ในทั้ง LeftTable และ RightTable เหมาะกับการหาสิ่งที่ซ้ำกัน/ร่วมกันระหว่างสองชุดข้อมูล โดยรักษาเอาแถวที่ซ้ำกันไว้ด้วย
สร้างตารางใหม่โดยเลือกเฉพาะคอลัมน์ที่ต้องการจากตารางต้นฉบับและเพิ่มคอลัมน์ที่คำนวณได้ ต่างจาก ADDCOLUMNS ตรงที่ SELECTCOLUMNS เริ่มจากตารางว่างแล้วเพิ่มเฉพาะคอลัมน์ที่ระบุ ทำให้สามารถปรับโครงสร้างตารางและเลือกข้อมูลที่จำเป็นได้อย่างยืดหยุ่น
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 รวมหลายตารางให้เป็นตารางเดียวด้วยการต่อแถว โดยเก็บแถวซ้ำไว้ทั้งหมด เหมาะกับการรวมชุดข้อมูลที่มีโครงสร้างคอลัมน์สอดคล้องกัน
VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้
FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่