Thep Excel

CROSSFILTERกำหนดทิศทางการกรองข้ามความสัมพันธ์ชั่วคราว

CROSSFILTER กำหนดทิศทางการกรองข้ามความสัมพันธ์ระหว่าง 2 คอลัมน์ชั่วคราว (มักใช้ใน CALCULATE) เพื่อควบคุมการไหลของตัวกรองหรือปิดการกรองข้ามในบางการคำนวณ

fx
=CROSSFILTER(<LeftColumnName>, <RightColumnName>, <CrossFilterType>)

ความนิยม5/10
ความยาก5/10
ประโยชน์5/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
LeftColumnName column คอลัมน์ฝั่งซ้ายของความสัมพันธ์ (ปลายทางหนึ่งของความสัมพันธ์) ต้องเป็นคอลัมน์จริงในโมเดล
RightColumnName column คอลัมน์ฝั่งขวาของความสัมพันธ์ (ปลายทางอีกฝั่งหนึ่งของความสัมพันธ์) ต้องเป็นปลายทางที่มีความสัมพันธ์กับ LeftColumnName
CrossFilterType text/number ชนิดทิศทางการกรอง: None (0), OneWay (1), Both (2), OneWay_RightFiltersLeft (3), OneWay_LeftFiltersRight (4)

Additional Notes

CROSSFILTER ใช้กำหนดทิศทางการกรองข้ามความสัมพันธ์ระหว่าง 2 ตาราง “ชั่วคราว” เฉพาะตอนประเมินนิพจน์ (มักใช้ภายใน CALCULATE) เพื่อควบคุมว่า ตัวกรองจะไหลจากตารางไหนไปตารางไหน หรือปิดการกรองข้ามไปเลย เหมาะกับโมเดลที่มีความสัมพันธ์หลายทาง หรือมีความสัมพันธ์แบบทางเดียว แต่ต้องการเปลี่ยนทิศทางสำหรับการคำนวณบางตัว

ที่เจ๋งของ CROSSFILTER คือ มันออกแบบมาเฉพาะเพื่อแก้ปัญหาความสัมพันธ์ที่ “ไม่ทำงานทิศทางที่เราต้องการ” โดยไม่ต้องไปแก้โมเดลนั้นเอง – ปรับแต่งเฉพาะการคำนวณที่ต้องการและสิ้นสุดเมื่อออกจาก CALCULATE นั้น ส่วนตัวผมว่าฟังก์ชันนี้เป็นเหมือน “ลัดเล่นความสัมพันธ์” ที่ช่วยมากเมื่อการกรองข้ามตัวนี้ทำให้ผลลัพธ์ผิดได้ ✨

How it works

ปิดการกรองข้ามชั่วคราว

เช่น ต้องการคำนวณที่ไม่ให้ตัวกรองไหลผ่านความสัมพันธ์บางเส้น

เปลี่ยนทิศทางการกรองให้เหมาะกับการคำนวณ

เช่น ทำให้ตัวกรองไหลสองทางเฉพาะในมาตรวัดบางตัว

Examples

ตัวอย่างที่ 1: ปิดการกรองข้าม (None)Sales (ไม่มีการกรองข้าม) = CALCULATE( [Sales Amount], CROSSFILTER( Sales[ProductID], Products[ProductID], None ) )

ใช้ None (หรือ 0) เพื่อไม่ให้ตัวกรองไหลผ่านความสัมพันธ์นี้ขณะประเมินมาตรวัด ตัวกรองจาก Products จะไม่ส่งผลกระทบต่อ Sales

fx
=Sales (ไม่มีการกรองข้าม) =
CALCULATE(
[Sales Amount],
CROSSFILTER(
Sales[ProductID],
Products[ProductID],
None
)
)

ผลลัพธ์ยอดขายรวม โดยปิดการกรองข้ามจากตาราง Products โดยสิ้นเชิง
ตัวอย่างที่ 2: เปิดการกรองสองทาง (Both)Sales (กรองสองทาง) = CALCULATE( [Sales Amount], CROSSFILTER( Sales[ProductID], Products[ProductID], Both ) )

ใช้ Both (หรือ 2) เพื่อให้ตัวกรองไหลได้สองทาง (ปกติจะเป็นทางเดียว) ระวังเพราะอาจเปลี่ยนความหมายของโมเดล

fx
=Sales (กรองสองทาง) =
CALCULATE(
[Sales Amount],
CROSSFILTER(
Sales[ProductID],
Products[ProductID],
Both
)
)

ผลลัพธ์ยอดขายรวม โดยตัวกรองไหลได้สองทาง
ตัวอย่างที่ 3: กำหนดทิศทางจากซ้ายไปขวา (OneWay_LeftFiltersRight)Sales (Left→Right) = CALCULATE( [Sales Amount], CROSSFILTER( Products[ProductID], Sales[ProductID], OneWay_LeftFiltersRight ) )

ใช้ OneWay_LeftFiltersRight (หรือ 4) เพื่อบังคับให้ตัวกรองไหลจาก Products → Sales เฉพาะการคำนวณนี้

fx
=Sales (Left→Right) =
CALCULATE(
[Sales Amount],
CROSSFILTER(
Products[ProductID],
Sales[ProductID],
OneWay_LeftFiltersRight
)
)

ผลลัพธ์ยอดขายรวม โดยตัวกรองไหลจากซ้ายไปขวา
ตัวอย่างที่ 4: กำหนดทิศทางจากขวาไปซ้าย (OneWay_RightFiltersLeft)Products (Right→Left) = CALCULATE( COUNTROWS(Products), CROSSFILTER( Products[ProductID], Sales[ProductID], OneWay_RightFiltersLeft ) )

ใช้ OneWay_RightFiltersLeft (หรือ 3) เพื่อบังคับให้ตัวกรองไหลจาก Sales → Products ซึ่งมีประโยชน์เมื่อต้องการผลกระทบแบบปลิวกลับ

fx
=Products (Right→Left) =
CALCULATE(
COUNTROWS(Products),
CROSSFILTER(
Products[ProductID],
Sales[ProductID],
OneWay_RightFiltersLeft
)
)

ผลลัพธ์จำนวนสินค้า โดยตัวกรองจาก Sales ส่งผลกระทบ
ตัวอย่างที่ 5: การใช้งานจริง – ยอดขายทั้งหมดไม่สนใจสินค้าTotal All Sales = CALCULATE( SUM(Sales[Amount]), CROSSFILTER( Sales[ProductID], Products[ProductID], None ) )

แม้ว่าผู้ใช้เลือกสินค้าบางอันใน Slicer มาตรวัดนี้ก็จะคำนวณยอดขายทั้งหมดแทน เนื่องจากปิดการกรองข้าม

fx
Total All Sales =
CALCULATE(
SUM(Sales[Amount]),
CROSSFILTER(
Sales[ProductID],
Products[ProductID],
None
)
)

ผลลัพธ์10500 (ยอดขายทั้งหมด ไม่เว้นบางสินค้า)

FAQs

CROSSFILTER ใช้ได้ที่ไหนบ่อยที่สุด?+

มักใช้ภายใน CALCULATE เป็นตัวกรอง (filter argument) เพื่อปรับทิศทางการกรองข้ามความสัมพันธ์ชั่วคราวสำหรับการคำนวณนั้น ๆ เท่านั้น

CROSSFILTER ต่างจาก USERELATIONSHIP อย่างไร?+

USERELATIONSHIP ใช้เปิดความสัมพันธ์ที่ "ไม่ active" ชั่วคราว ส่วน CROSSFILTER ใช้เปลี่ยนทิศทาง/ปิดการกรองข้ามของความสัมพันธ์ที่ "มี active อยู่แล้ว" ชั่วคราว หรือทั้ง 2 แบบรวมกันก็ได้

CROSSFILTER ใช้ OneWay vs OneWay_LeftFiltersRight แตกต่างไหม?+

OneWay (1) คือการใช้ตัวกรองตามความสัมพันธ์ปกติ ส่วน OneWay_LeftFiltersRight (4) หมายความว่าบังคับให้ฝั่งซ้ายกรองฝั่งขวา ส่วน OneWay_RightFiltersLeft (3) บังคับให้ฝั่งขวากรองฝั่งซ้าย

จะรู้ได้ไหมว่าต้องใช้ CrossFilterType ไหน?+

ลองคำนวณผลลัพธ์ด้วยตัวกรองต่างๆ แล้วดูว่าอันไหนให้ผลถูกต้อง ปกติ None มักใช้เพื่อ "เพิกเฉยต่อตัวกรองชั่วขณะ" และ Both มักใช้เมื่อต้องการตัวกรองแบบสองทาง

CROSSFILTER ส่งผล Permanent หรือ Temporary?+

Temporary เท่านั้น – มันใช้ได้แค่ภายในนิพจน์ CALCULATE หรือ CALCULATETABLE ที่ใช้ CROSSFILTER นั้น สิ้นสุดเมื่อออกจากฟังก์ชันนั้น

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ CROSSFILTER จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้CROSSFILTERRelationship
Filter (3)
CALCULATE

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

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

FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน

Relationship (3)
RELATED

RELATED คืนค่า scalar value (ค่าเดี่ยว) จากคอลัมน์ในตารางที่มีความสัมพันธ์แบบ many-to-one โดยอาศัย relationship ที่กำหนดไว้ในโมเดล ฟังก์ชันนี้ต้องการ row context และสามารถ traverse relationship chain ข้ามหลายขั้นได้ตราบใดที่ทุก relationship อยู่ในทิศทางเดียวกัน

RELATEDTABLE

RELATEDTABLE ทำ context transition คืนตารางของแถวฝั่ง Many ที่เกี่ยวข้องกับแถวปัจจุบัน โดยใช้ Relationship ในโมเดล เป็นทางลัดของ CALCULATETABLE แต่ Microsoft ไม่แนะนำใช้แล้ว

USERELATIONSHIP

USERELATIONSHIP ช่วยให้คุณใช้ relationship ที่ไม่ใช่ active หรือเปลี่ยน relationship ที่ใช้ในการคำนวณ เหมาะสำหรับสถานการณ์เช่น sales data ที่มีหลาย date columns (OrderDate, ShippingDate, DeliveryDate)

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่