| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| filter | table/boolean | นิพจน์ตัวกรอง (ได้ทั้ง Boolean Filter หรือ Table Expression) ที่ต้องการนำไปรวมกับตัวกรองเดิมใน Context |
KEEPFILTERS เป็นฟังก์ชัน Filter Modifier ที่ใช้ภายใน CALCULATE (หรือ CALCULATETABLE) เพื่อ คงตัวกรองเดิมที่มีอยู่ ไม่ให้ถูกเขียนทับ (Overwrite) ด้วยตัวกรองใหม่ที่เราใส่เข้าไปใน CALCULATE
โดยปกติแล้ว เมื่อเราใส่ Filter ใน CALCULATE ตัวกรองเหล่านั้นจะ Overwrite ตัวกรองเดิมที่อยู่ใน Context (เช่น เมื่อใช้ Slicer เลือก WA และเขียน CALCULATE(measure, state=”OR”) ผลลัพธ์จะเป็น OR ไม่ใช่ WA) แต่ KEEPFILTERS จะเปลี่ยนพฤติกรรมนั้นให้เป็นการนำตัวกรองเดิมและตัวกรองใหม่มาตัดกัน (Intersection / AND Logic) ดังนั้นจะได้เฉพาะส่วนที่ตรงกัน
ทำงานได้ดีกับ Iterator Functions (SUMX, AVERAGEX, MAXX ฯลฯ) ที่ต้องการ Preserve ตัวกรองข้างนอก ขณะที่ Iterate ผ่านแต่ละแถว
ส่วนตัวผม เห็นว่า KEEPFILTERS เป็นเครื่องมือที่ทรงพลังสำหรับการควบคุม Filter Context ใน Dashboard ที่ซับซ้อน เพราะมันอนุญาตให้คุณเพิ่มเงื่อนไขโดยไม่ยุบลงตัวกรองที่ผู้ใช้เลือกไว้แล้ว 😎
ถ้าผู้ใช้เลือกสินค้าใน Slicer แล้วอยากจะดูว่าในกลุ่มสินค้านั้นมี 'สีแดง' ขายได้เท่าไหร่
เมื่อต้องการให้ตัวกรองจาก Measure และตัวกรองจาก Context ทำงานร่วมกันแบบ AND
ถ้ามีการเลือกปี 2023 ใน Slicer และมี Measure นี้ ตัวกรอง 'Product'[Color] = "Red" จะไปรวมกับ 'Date'[Year] = 2023 ทำให้ได้ยอดขายสินค้าสีแดงเฉพาะปี 2023
KEEPFILTERS ทำให้เงื่อนไข Brand=A นำมาตัดกับเงื่อนไขที่ Slicer เลือก (Brand in B,C) ผลจึงเป็น BLANK เพราะไม่มีแถวข้อมูลที่เป็น A และ (B หรือ C) ในเวลาเดียวกัน
KEEPFILTERS ทำให้ TOPN ทำงานร่วมกับ Filter หมวดหมู่สินค้าที่ผู้ใช้เลือก ไม่ใช่ดึง Top 10 ของทั้งบริษัทมาแสดง
KEEPFILTERS ในตัวอย่างนี้ใช้ใน nested CALCULATE เพื่อแสดง Intersection Logic: ตัวกรองภายใน (WA|OR) ตัดกับตัวกรองภายนอก (WA|BC) ได้ผลลัพธ์เพียง WA เพราะเป็นส่วนที่ตรงกัน
ใช่ KEEPFILTERS เป็น Filter Modifier ที่ออกแบบมาเพื่อทำงานร่วมกับ CALCULATE เท่านั้น
โดยปกติ Boolean Filter ใน CALCULATE มัก “เขียนทับ” ตัวกรองเดิมของคอลัมน์นั้น (Override) แต่เมื่อครอบด้วย KEEPFILTERS จะกลายเป็นการ “คงตัวกรองเดิม” และนำเงื่อนไขใหม่มารวมกันแบบ AND ทำให้ผลลัพธ์แคบลงตามทั้งสองเงื่อนไข
ถ้าตัวกรองเดิมและตัวกรองใหม่ไม่มีส่วนตัดกัน (เช่น Slicer เลือก Brand B,C แต่คุณใส่ KEEPFILTERS(Brand = "A")) ผลลัพธ์จะไม่มีแถวที่ผ่านเงื่อนไข จึงมักได้ BLANK หรือ 0 ขึ้นกับ Measure
ใช้เมื่อ TOPN สร้างตารางผู้ชนะ (เช่น Top 10) แล้วคุณต้องการให้ผลลัพธ์ยังเคารพตัวกรองเดิม (เช่น หมวดหมู่/ภูมิภาคที่ผู้ใช้เลือก) โดยให้ TOPN ทำงานภายในกรอบของ Context เดิม ไม่ใช่ดึง Top ทั้งบริษัท
ฟังก์ชันที่ผู้เขียนโยงไว้กับ KEEPFILTERS จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
ALL มีพฤติกรรมแตกต่างกัน 2 แบบ: ใช้เป็น Table Expression จะคืนทุกแถวในตาราง หรือทุกค่าในคอลัมน์ โดยไม่สนใจ Filter ใดๆ เหมาะสำหรับใช้ร่วมกับ FILTER, COUNTROWS, SUMMARIZE หรือใช้เป็น CALCULATE Modifier เพื่อลบ Filter ออกจากตารางหรือคอลัมน์ที่ระบุ ทำให้สามารถคำนวณ Grand Total หรือหาเปอร์เซ็นต์เทียบกับยอดรวมได้
CALCULATE เป็นฟังก์ชันหลักที่สำคัญที่สุดใน DAX ใช้สำหรับ evaluate expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน สามารถเพิ่มตัวกรองใหม่ ลบตัวกรองเดิม หรือแทนที่ filter ที่มีอยู่ได้ รองรับทั้ง Boolean expression และ table expression เป็น filter arguments พร้อม filter modifier functions เช่น REMOVEFILTERS, ALL, ALLEXCEPT, KEEPFILTERS เพื่อควบคุมการกรองอย่างละเอียด มีพฤติกรรมพิเศษคือ context transition ที่เปลี่ยน row context เป็น filter context โดยอัตโนมัติ ทำให้เป็นเครื่องมือหลักในการสร้าง measure ที่ซับซ้อนและ calculated column ที่ต้องใช้ aggregation
CALCULATETABLE evaluate table expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน แล้วคืนค่าเป็น table (ตาราง) ซึ่งแตกต่างจาก CALCULATE ที่คืนค่าเป็น scalar value รองรับ filter arguments 3 รูปแบบ: Boolean expression, table expression, และ filter modifier functions (REMOVEFILTERS, ALL, KEEPFILTERS, USERELATIONSHIP, CROSSFILTER) มีพฤติกรรมเหมือน CALCULATE ในทุกแง่มุมของการจัดการ filter context รวมถึง context transition แต่เหมาะสำหรับการสร้าง intermediate table ที่ถูกกรองแล้วส่งต่อให้ iterator functions หรือใช้ใน calculated table มักมี performance ดีกว่า FILTER ใน simple filtering scenarios เพราะ DAX engine สามารถทำ cardinality estimation และ optimization ได้ดีกว่า
FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน
REMOVEFILTERS ลบ Filter ออกจากตารางหรือคอลัมน์ที่ระบุ ใช้ได้ใน CALCULATE เท่านั้น เทียบเท่า ALL เมื่อใช้เป็น CALCULATE Modifier แต่ชัดเจนและอ่านโค้ดง่ายกว่า แนะนำใช้แทน ALL เพราะสื่อความหมายได้ดีกว่า
TREATAS เป็นเสมือนการสร้าง "virtual relationship" โดยไม่ต้องแก้โมเดล ช่วยให้ส่งเงื่อนไขข้ามตารางที่ไม่เชื่อมกัน หรือเมื่อต้องการส่งหลายคีย์พร้อมกัน
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่