แชร์ผ่าน


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

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

หมายเหตุ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

การแนะนำ

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

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

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