CONTAINSROW ตรวจสอบว่ามีแถวที่ค่าคอลัมน์ตรงกันหมดหรือไม่ ถ้าเจอจะคืนค่า TRUE ไม่มีจะคืน FALSE
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| table | Table | ตารางที่ต้องการเช็ค สามารถเป็นตาราง inline เช่น {“Red”, “Blue”} หรือตาราง DAX เช่น SUMMARIZE() VALUES() ได้ |
| value | Scalar | ค่าที่ต้องการเช็คว่าตรงกันหรือไม่ จำนวนค่าต้องเท่ากับจำนวนคอลัมน์ในตาราง เรียงตามลำดับคอลัมน์ สามารถใส่หลายค่าได้ |
CONTAINSROW คือฟังก์ชันสำหรับเช็คว่ามีแถวใดในตารางที่ค่าคอลัมน์ทั้งหมดตรงกับที่ระบุหรือไม่ มันสำคัญเวลาต้องการทำ lookup แบบหลายคอลัมน์พร้อมกัน
ที่เจ๋งคือ CONTAINSROW ทำให้การเช็คค่าหลายคอลัมน์พร้อมกันง่ายขึ้น เทียบเสมือนว่าคุณมีรายชื่อคู่ (ProductID, StoreID) และต้องการรู้ว่ามีคู่ (101, 5) อยู่ในรายชื่อนั้นหรือไม่ ถ้าตัวเลขตรงครบ เงื่อนไขที่มีก็ให้ TRUE ส่วนตัวผมใช้ CONTAINSROW เวลาต้องทำ master-detail validation หรือ check data integrity ระหว่างตาราง
ตรวจสอบว่า "Red" อยู่ในรายชื่อสีหรือไม่ เนื่องจากมี "Red" อยู่ ผลลัพธ์คือ TRUE ใช้ตรวจสอบค่าเดี่ยวแบบง่ายๆ
สร้างตารางคู่ (ProductID, StoreID) จาก Sales ด้วย SUMMARIZE แล้วใช้ CONTAINSROW เพื่อเช็คว่ามีคู่ (101, 5) อยู่ในตารางหรือไม่ เหมาะสำหรับ validate master data
กรองสินค้าเฉพาะที่มี Category อยู่ในตาราง Category master ใช้ CONTAINSROW เป็นตัวกรองใน FILTER เพื่อคัดเลือกเฉพาะแถวที่ valid
ค้นหาสาขาที่ไม่มีใครซื้อ (ไม่อยู่ในตาราง Sales) โดยใช้ NOT CONTAINSROW จะดูเหมือนหา missing records ใน master table
ตัวจริงแล้ว IN operator ทำงานเหมือน CONTAINSROW เลย ผมค่อนข้างมองว่า IN เป็น syntax ที่สะดวกกว่า เขียน Product[Color] IN {"Red", "Blue"} ง่ายกว่า CONTAINSROW({"Red", "Blue"}, Product[Color]) แต่ผลลัพธ์เหมือนเดิม
ต้องส่งให้เท่ากับจำนวนคอลัมน์ในตาราง เช่นตารางมี 2 คอลัมน์ต้องส่ง 2 ค่า ตาราง 3 คอลัมน์ต้องส่ง 3 ค่า เรียงตามลำดับคอลัมน์นะ ถ้าจำนวนไม่ตรง DAX จะขึ้น error
ผม highlight ตรงนี้เพราะสำคัญ CONTAINSROW ใช้ strict comparison หมายความว่า BLANK ไม่เท่ากับ 0 ตรงกันข้ามกับ = operator แบบปกติ ถ้าคอลัมน์มี BLANK และคุณส่ง 0 มา CONTAINSROW จะคืน FALSE เพราะมันถือว่าไม่ตรงกัน
ผมใช้ CONTAINSROW เวลาต้องตรวจสอบความสมบูรณ์ข้อมูล (data integrity) เช่น Product-Store mapping complete ไหม Customer สั่งซื้อครบทั้งประเทศไหม หรือต้อง lookup หลายคอลัมน์พร้อมกัน ถ้าเช็คแค่คอลัมน์เดียว CONTAINS หรือ IN ก็พอ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ CONTAINSROW จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
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 ดีกว่าอย่างมาก
VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้
CONTAINS ค้นหาแถวในตารางและคืนค่า TRUE/FALSE เมื่อหาเจอค่าที่ตรงกับเงื่อนไขที่กำหนด เจ๋งเพราะมันเร็วกว่า COUNTROWS + FILTER มาก
FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่