CROSSFILTER กำหนดทิศทางการกรองข้ามความสัมพันธ์ระหว่าง 2 คอลัมน์ชั่วคราว (มักใช้ใน CALCULATE) เพื่อควบคุมการไหลของตัวกรองหรือปิดการกรองข้ามในบางการคำนวณ
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| LeftColumnName | column | คอลัมน์ฝั่งซ้ายของความสัมพันธ์ (ปลายทางหนึ่งของความสัมพันธ์) ต้องเป็นคอลัมน์จริงในโมเดล |
| RightColumnName | column | คอลัมน์ฝั่งขวาของความสัมพันธ์ (ปลายทางอีกฝั่งหนึ่งของความสัมพันธ์) ต้องเป็นปลายทางที่มีความสัมพันธ์กับ LeftColumnName |
| CrossFilterType | text/number | ชนิดทิศทางการกรอง: None (0), OneWay (1), Both (2), OneWay_RightFiltersLeft (3), OneWay_LeftFiltersRight (4) |
CROSSFILTER ใช้กำหนดทิศทางการกรองข้ามความสัมพันธ์ระหว่าง 2 ตาราง “ชั่วคราว” เฉพาะตอนประเมินนิพจน์ (มักใช้ภายใน CALCULATE) เพื่อควบคุมว่า ตัวกรองจะไหลจากตารางไหนไปตารางไหน หรือปิดการกรองข้ามไปเลย เหมาะกับโมเดลที่มีความสัมพันธ์หลายทาง หรือมีความสัมพันธ์แบบทางเดียว แต่ต้องการเปลี่ยนทิศทางสำหรับการคำนวณบางตัว
ที่เจ๋งของ CROSSFILTER คือ มันออกแบบมาเฉพาะเพื่อแก้ปัญหาความสัมพันธ์ที่ “ไม่ทำงานทิศทางที่เราต้องการ” โดยไม่ต้องไปแก้โมเดลนั้นเอง – ปรับแต่งเฉพาะการคำนวณที่ต้องการและสิ้นสุดเมื่อออกจาก CALCULATE นั้น ส่วนตัวผมว่าฟังก์ชันนี้เป็นเหมือน “ลัดเล่นความสัมพันธ์” ที่ช่วยมากเมื่อการกรองข้ามตัวนี้ทำให้ผลลัพธ์ผิดได้ ✨
เช่น ต้องการคำนวณที่ไม่ให้ตัวกรองไหลผ่านความสัมพันธ์บางเส้น
เช่น ทำให้ตัวกรองไหลสองทางเฉพาะในมาตรวัดบางตัว
ใช้ None (หรือ 0) เพื่อไม่ให้ตัวกรองไหลผ่านความสัมพันธ์นี้ขณะประเมินมาตรวัด ตัวกรองจาก Products จะไม่ส่งผลกระทบต่อ Sales
ใช้ Both (หรือ 2) เพื่อให้ตัวกรองไหลได้สองทาง (ปกติจะเป็นทางเดียว) ระวังเพราะอาจเปลี่ยนความหมายของโมเดล
ใช้ OneWay_LeftFiltersRight (หรือ 4) เพื่อบังคับให้ตัวกรองไหลจาก Products → Sales เฉพาะการคำนวณนี้
ใช้ OneWay_RightFiltersLeft (หรือ 3) เพื่อบังคับให้ตัวกรองไหลจาก Sales → Products ซึ่งมีประโยชน์เมื่อต้องการผลกระทบแบบปลิวกลับ
แม้ว่าผู้ใช้เลือกสินค้าบางอันใน Slicer มาตรวัดนี้ก็จะคำนวณยอดขายทั้งหมดแทน เนื่องจากปิดการกรองข้าม
มักใช้ภายใน CALCULATE เป็นตัวกรอง (filter argument) เพื่อปรับทิศทางการกรองข้ามความสัมพันธ์ชั่วคราวสำหรับการคำนวณนั้น ๆ เท่านั้น
USERELATIONSHIP ใช้เปิดความสัมพันธ์ที่ "ไม่ active" ชั่วคราว ส่วน CROSSFILTER ใช้เปลี่ยนทิศทาง/ปิดการกรองข้ามของความสัมพันธ์ที่ "มี active อยู่แล้ว" ชั่วคราว หรือทั้ง 2 แบบรวมกันก็ได้
OneWay (1) คือการใช้ตัวกรองตามความสัมพันธ์ปกติ ส่วน OneWay_LeftFiltersRight (4) หมายความว่าบังคับให้ฝั่งซ้ายกรองฝั่งขวา ส่วน OneWay_RightFiltersLeft (3) บังคับให้ฝั่งขวากรองฝั่งซ้าย
ลองคำนวณผลลัพธ์ด้วยตัวกรองต่างๆ แล้วดูว่าอันไหนให้ผลถูกต้อง ปกติ None มักใช้เพื่อ "เพิกเฉยต่อตัวกรองชั่วขณะ" และ Both มักใช้เมื่อต้องการตัวกรองแบบสองทาง
Temporary เท่านั้น – มันใช้ได้แค่ภายในนิพจน์ CALCULATE หรือ CALCULATETABLE ที่ใช้ CROSSFILTER นั้น สิ้นสุดเมื่อออกจากฟังก์ชันนั้น
ฟังก์ชันที่ผู้เขียนโยงไว้กับ CROSSFILTER จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
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 โดยตรงแทน
RELATED คืนค่า scalar value (ค่าเดี่ยว) จากคอลัมน์ในตารางที่มีความสัมพันธ์แบบ many-to-one โดยอาศัย relationship ที่กำหนดไว้ในโมเดล ฟังก์ชันนี้ต้องการ row context และสามารถ traverse relationship chain ข้ามหลายขั้นได้ตราบใดที่ทุก relationship อยู่ในทิศทางเดียวกัน
RELATEDTABLE ทำ context transition คืนตารางของแถวฝั่ง Many ที่เกี่ยวข้องกับแถวปัจจุบัน โดยใช้ Relationship ในโมเดล เป็นทางลัดของ CALCULATETABLE แต่ Microsoft ไม่แนะนำใช้แล้ว
USERELATIONSHIP ช่วยให้คุณใช้ relationship ที่ไม่ใช่ active หรือเปลี่ยน relationship ที่ใช้ในการคำนวณ เหมาะสำหรับสถานการณ์เช่น sales data ที่มีหลาย date columns (OrderDate, ShippingDate, DeliveryDate)
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่