CROSSFILTER กำหนดทิศทางการกรองข้ามความสัมพันธ์ระหว่าง 2 คอลัมน์ชั่วคราว (มักใช้ใน CALCULATE) เพื่อควบคุมการไหลของตัวกรองหรือปิดการกรองข้ามในบางการคำนวณ
=CROSSFILTER(<LeftColumnName>, <RightColumnName>, <CrossFilterType>)
=CROSSFILTER(<LeftColumnName>, <RightColumnName>, <CrossFilterType>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| LeftColumnName | column | Yes | คอลัมน์ฝั่งซ้ายของความสัมพันธ์ (ปลายทางหนึ่งของความสัมพันธ์) ต้องเป็นคอลัมน์จริงในโมเดล | |
| RightColumnName | column | Yes | คอลัมน์ฝั่งขวาของความสัมพันธ์ (ปลายทางอีกฝั่งหนึ่งของความสัมพันธ์) ต้องเป็นปลายทางที่มีความสัมพันธ์กับ LeftColumnName | |
| CrossFilterType | text/number | Yes | ชนิดทิศทางการกรอง: None (0), OneWay (1), Both (2), OneWay_RightFiltersLeft (3), OneWay_LeftFiltersRight (4) |
เช่น ต้องการคำนวณที่ไม่ให้ตัวกรองไหลผ่านความสัมพันธ์บางเส้น
เช่น ทำให้ตัวกรองไหลสองทางเฉพาะในมาตรวัดบางตัว
Sales (ไม่มีการกรองข้าม) = CALCULATE( [Sales Amount], CROSSFILTER( Sales[ProductID], Products[ProductID], None ) )=Sales (ไม่มีการกรองข้าม) =
CALCULATE(
[Sales Amount],
CROSSFILTER(
Sales[ProductID],
Products[ProductID],
None
)
)
ยอดขายรวม โดยปิดการกรองข้ามจากตาราง Products โดยสิ้นเชิง
Sales (กรองสองทาง) = CALCULATE( [Sales Amount], CROSSFILTER( Sales[ProductID], Products[ProductID], Both ) )=Sales (กรองสองทาง) =
CALCULATE(
[Sales Amount],
CROSSFILTER(
Sales[ProductID],
Products[ProductID],
Both
)
)
ยอดขายรวม โดยตัวกรองไหลได้สองทาง
Sales (Left→Right) = CALCULATE( [Sales Amount], CROSSFILTER( Products[ProductID], Sales[ProductID], OneWay_LeftFiltersRight ) )=Sales (Left→Right) =
CALCULATE(
[Sales Amount],
CROSSFILTER(
Products[ProductID],
Sales[ProductID],
OneWay_LeftFiltersRight
)
)
ยอดขายรวม โดยตัวกรองไหลจากซ้ายไปขวา
Products (Right→Left) = CALCULATE( COUNTROWS(Products), CROSSFILTER( Products[ProductID], Sales[ProductID], OneWay_RightFiltersLeft ) )=Products (Right→Left) =
CALCULATE(
COUNTROWS(Products),
CROSSFILTER(
Products[ProductID],
Sales[ProductID],
OneWay_RightFiltersLeft
)
)
จำนวนสินค้า โดยตัวกรองจาก Sales ส่งผลกระทบ
Total All Sales = CALCULATE( SUM(Sales[Amount]), CROSSFILTER( Sales[ProductID], Products[ProductID], None ) )Total All Sales =
CALCULATE(
SUM(Sales[Amount]),
CROSSFILTER(
Sales[ProductID],
Products[ProductID],
None
)
)
10500 (ยอดขายทั้งหมด ไม่เว้นบางสินค้า)
มักใช้ภายใน CALCULATE เป็นตัวกรอง (filter argument) เพื่อปรับทิศทางการกรองข้ามความสัมพันธ์ชั่วคราวสำหรับการคำนวณนั้น ๆ เท่านั้น
USERELATIONSHIP ใช้เปิดความสัมพันธ์ที่ “ไม่ active” ชั่วคราว ส่วน CROSSFILTER ใช้เปลี่ยนทิศทาง/ปิดการกรองข้ามของความสัมพันธ์ที่ “มี active อยู่แล้ว” ชั่วคราว หรือทั้ง 2 แบบรวมกันก็ได้
OneWay (1) คือการใช้ตัวกรองตามความสัมพันธ์ปกติ ส่วน OneWay_LeftFiltersRight (4) หมายความว่าบังคับให้ฝั่งซ้ายกรองฝั่งขวา ส่วน OneWay_RightFiltersLeft (3) บังคับให้ฝั่งขวากรองฝั่งซ้าย
ลองคำนวณผลลัพธ์ด้วยตัวกรองต่างๆ แล้วดูว่าอันไหนให้ผลถูกต้อง ปกติ None มักใช้เพื่อ “เพิกเฉยต่อตัวกรองชั่วขณะ” และ Both มักใช้เมื่อต้องการตัวกรองแบบสองทาง
Temporary เท่านั้น – มันใช้ได้แค่ภายในนิพจน์ CALCULATE หรือ CALCULATETABLE ที่ใช้ CROSSFILTER นั้น สิ้นสุดเมื่อออกจากฟังก์ชันนั้น
CROSSFILTER ใช้กำหนดทิศทางการกรองข้ามความสัมพันธ์ระหว่าง 2 ตาราง “ชั่วคราว” เฉพาะตอนประเมินนิพจน์ (มักใช้ภายใน CALCULATE) เพื่อควบคุมว่า ตัวกรองจะไหลจากตารางไหนไปตารางไหน หรือปิดการกรองข้ามไปเลย เหมาะกับโมเดลที่มีความสัมพันธ์หลายทาง หรือมีความสัมพันธ์แบบทางเดียว แต่ต้องการเปลี่ยนทิศทางสำหรับการคำนวณบางตัว
ที่เจ๋งของ CROSSFILTER คือ มันออกแบบมาเฉพาะเพื่อแก้ปัญหาความสัมพันธ์ที่ “ไม่ทำงานทิศทางที่เราต้องการ” โดยไม่ต้องไปแก้โมเดลนั้นเอง – ปรับแต่งเฉพาะการคำนวณที่ต้องการและสิ้นสุดเมื่อออกจาก CALCULATE นั้น ส่วนตัวผมว่าฟังก์ชันนี้เป็นเหมือน “ลัดเล่นความสัมพันธ์” ที่ช่วยมากเมื่อการกรองข้ามตัวนี้ทำให้ผลลัพธ์ผิดได้ ✨