หลีกเลี่ยงการใช้ตัวกรองเป็นอาร์กิวเมนต์ตัวกรอง

ในฐานะที่เป็นผู้สร้างแบบจำลองข้อมูล คุณจะเขียนนิพจน์ DAX ที่จำเป็นต้องได้รับการประเมินในบริบทตัวกรองที่ปรับเปลี่ยนแล้ว ตัวอย่างเช่น คุณสามารถเขียนข้อกำหนดหน่วยวัดเพื่อคำนวณยอดขายสำหรับ "ผลิตภัณฑ์ที่มีอัตรากำไรสูง" เราจะอธิบายการคำนวณนี้ในภายหลังในบทความนี้

หมายเหตุ

บทความนี้จะเกี่ยวข้องโดยเฉพาะอย่างยิ่งสำหรับการคำนวณแบบจำลองที่ใช้ตัวกรองในการนำเข้าตาราง

ฟังก์ชัน CALCULATE และ CALCULATETABLE DAX เป็นฟังก์ชันที่สำคัญและมีประโยชน์ ซึ่งช่วยให้คุณสามารถเขียนการคำนวณที่ลบหรือเพิ่มตัวกรอง หรือปรับเปลี่ยนเส้นทางความสัมพันธ์ได้ การดำเนินการโดยการส่งผ่านในอาร์กิวเมนต์ตัวกรอง ซึ่งเป็นนิพจน์บูลีน นิพจน์ตาราง หรือฟังก์ชันตัวกรองพิเศษ เราจะพูดคุยเกี่ยวกับนิพจน์บูลีนและตารางในบทความนี้เท่านั้น

พิจารณาข้อกำหนดหน่วยวัดต่อไปนี้ ซึ่งจะคำนวณยอดขายผลิตภัณฑ์สีแดงโดยใช้นิพจน์ตาราง การดำเนินการดังกล่าวจะแทนที่ตัวกรองใด ๆ ที่อาจใช้กับตาราง ผลิตภัณฑ์

Red Sales =
CALCULATE(
    [Sales],
    FILTER('Product', 'Product'[Color] = "Red")
)

ฟังก์ชันการคำนวณจะยอมรับนิพจน์ตารางที่ส่งกลับโดยฟังก์ชัน FILTER DAX ซึ่งประเมินนิพจน์ตัวกรองสำหรับแต่ละแถวของตารางผลิตภัณฑ์ ซึ่งเป็นผลลัพธ์ที่ถูกต้อง–ผลการขายสำหรับผลิตภัณฑ์สีแดง อย่างไรก็ตาม อาจมีประสิทธิภาพมากขึ้นด้วยการใช้นิพจน์บูลีน

ข้อกำหนดนี้เป็นข้อกำหนดหน่วยวัดที่ได้รับการปรับปรุง ซึ่งใช้นิพจน์บูลีนแทนที่จะเป็นนิพจน์ตาราง ฟังก์ชัน KEEPFILTERS DAX ช่วยให้แน่ใจว่าตัวกรองใดๆ ที่มีอยู่ที่ใช้กับคอลัมน์ สี ได้รับการรักษาไว้และไม่ได้เขียนทับ

Red Sales =
CALCULATE(
    [Sales],
    KEEPFILTERS('Product'[Color] = "Red")
)

คุณควรส่งผ่านอาร์กิวเมนต์ตัวกรองเป็นนิพจน์บูลีนเมื่อใดก็ตามที่เป็นไปได้ เนื่องจากมีการนำเข้าตารางแบบจำลองเป็นที่เก็บคอลัมน์ในหน่วยความจำ ซึ่งจะได้รับการปรับให้เหมาะสมเพื่อให้สามารถกรองคอลัมน์ได้อย่างมีประสิทธิภาพด้วยวิธีนี้

อย่างไรก็ตาม มีข้อจำกัดที่ใช้กับนิพจน์บูลีนเมื่อใช้เป็นอาร์กิวเมนต์ตัวกรอง ข้อจำกัดเหล่านั้นคือ:

  • ไม่สามารถเปรียบเทียบคอลัมน์กับคอลัมน์อื่นได้
  • ไม่สามารถอ้างอิงหน่วยวัดได้
  • ไม่สามารถใช้ฟังก์ชันการคำนวณแบบซ้อนกันได้
  • ไม่สามารถใช้ฟังก์ชันที่สแกนหรือแสดงเป็นตารางได้

ซึ่งหมายความว่าคุณจะต้องใช้นิพจน์ตารางสำหรับข้อกำหนดของตัวกรองที่ซับซ้อนมากขึ้น

ตอนนี้ให้พิจารณาข้อกำหนดหน่วยวัดที่แตกต่างกัน

High Margin Product Sales =
CALCULATE(
    [Sales],
    FILTER(
        'Product',
        'Product'[ListPrice] > 'Product'[StandardCost] * 2
    )
)

ข้อกำหนดของ ผลิตภัณฑ์ที่มีอัตรากำไรสูง เป็นหนึ่งข้อกำหนดที่มีราคาตามรายการเกินกว่าค่าใช้จ่ายมาตรฐานสองเท่า ในตัวอย่างนี้ ฟังก์ชัน FILTER ต้องถูกนำมาใช้ เนื่องจากนิพจน์ตัวกรองมีความซับซ้อนเกินไปสำหรับนิพจน์บูลีน

นี่คือหนึ่งในตัวอย่างเพิ่มเติม ความต้องการในขณะนี้คือการคำนวณยอดขาย แต่เฉพาะสำหรับเดือนที่มีกำไรเท่านั้น

Sales for Profitable Months =
CALCULATE(
    [Sales],
    FILTER(
        VALUES('Date'[Month]),
        [Profit] > 0)
    )
)

ในตัวอย่างนี้ ฟังก์ชัน FILTER ต้องถูกนำมาใช้ เนื่องจากจำเป็นต้องประเมินผลหน่วยวัดกำไรเพื่อลบเดือนที่ไม่ได้กำไรออกไป ซึ่งไม่สามารถใช้หน่วยวัดในนิพจน์บูลีนเมื่อใช้เป็นอาร์กิวเมนต์ตัวกรอง

คำแนะนำ

เพื่อประสิทธิภาพที่ดีที่สุด คุณควรใช้นิพจน์บูลีนเป็นอาร์กิวเมนต์ตัวกรองเมื่อใดก็ตามที่เป็นไปได้

ดังนั้นควรใช้ฟังก์ชัน FILTER เฉพาะเมื่อจำเป็นเท่านั้น คุณสามารถใช้เพื่อดำเนินการเปรียบเทียบคอลัมน์ที่ซับซ้อนของตัวกรองได้ การเปรียบเทียบคอลัมน์เหล่านี้อาจเกี่ยวข้องกับ:

  • หน่วยวัด
  • คอลัมน์อื่น ๆ
  • การใช้ฟังก์ชัน OR DAX หรือตัวดำเนินการ OR เชิงตรรกะ (||)

นอกจากนี้ โปรดดู