CALCULATE คือฟังก์ชันที่ทรงพลังที่สุดและซับซ้อนที่สุดใน DAX ทำหน้าที่ประเมินผล Expression ภายใต้ บริบทตัวกรอง (Filter Context) ที่ถูกปรับเปลี่ยนใหม่ หากคุณเข้าใจ CALCULATE อย่างลึกซึ้ง คุณจะเข้าใจพฤติกรรมของ DAX ทั้งหมดครับ
ความจริงเกี่ยวกับ Filter Arguments
สิ่งสำคัญที่ต้องรู้คือ Filter Argument ทุกตัวใน CALCULATE คือ “ตาราง” (Table) เสมอ แม้ว่าคุณจะเขียนในรูปแบบ Boolean Expression (เช่น Product[Color] = "Red") ก็ตาม
เมื่อคุณเขียน:
CALCULATE( [Sales], 'Product'[Color] = "Red" )
DAX จะแปลงโค้ดนี้เบื้องหลัง (Internal Translation) เป็น:
CALCULATE(
[Sales],
FILTER( ALL( 'Product'[Color] ), 'Product'[Color] = "Red" )
)
จุดสังเกตที่สำคัญที่สุดคือฟังก์ชัน ALL ที่ถูกใส่เข้ามาอัตโนมัติ นี่คือสาเหตุว่าทำไมการเขียนแบบ Boolean ถึงเป็นการ “แทนที่” (Override) ตัวกรองเดิมเสมอ เพราะ ALL จะล้าง Filter เดิมของคอลัมน์นั้นทิ้งทั้งหมดก่อน แล้วค่อยใส่ “Red” เข้าไปใหม่
Context Transition (การเปลี่ยนบริบท)
Context Transition คือกระบวนการที่ CALCULATE เปลี่ยน Row Context (บริบทแถวปัจจุบัน) ให้กลายเป็น Filter Context (ตัวกรอง) ซึ่งจะเกิดขึ้นเมื่อ:
- ใช้ CALCULATE ภายใน Calculated Column
- ใช้ CALCULATE ภายใน Iterator Function (เช่น SUMX, FILTER)
พฤติกรรม: ค่าทั้งหมดใน “แถวปัจจุบัน” จะถูกเปลี่ยนเป็น Filter เพื่อกรองโมเดลข้อมูลก่อนทำการคำนวณ Expression
ข้อควรระวัง: การเรียกใช้ Measure ภายใน DAX expression จะมีการใส่ CALCULATE ครอบให้อัตโนมัติเสมอ ทำให้เกิด Context Transition โดยที่คุณอาจไม่รู้ตัว
ลำดับการทำงาน (Order of Evaluation)
เพื่อให้เข้าใจผลลัพธ์ที่ถูกต้อง คุณต้องทราบลำดับการทำงานภายในของ CALCULATE ดังนี้:
- Evaluate Filter Arguments: ประเมินค่าของ Filter Arguments ทั้งหมด ในบริบทเดิม (Original Context) ก่อนที่จะมีการเปลี่ยนแปลงใดๆ *ขั้นตอนนี้สำคัญมาก เพราะ Filter จะไม่ได้รับผลกระทบจาก Context Transition ที่เกิดจาก CALCULATE ตัวมันเอง
- Context Transition: ถ้าอยู่ใน Row Context, แถวปัจจุบันจะถูกแปลงเป็น Filter Context (Invalidate Row Context)
- Evaluate Modifiers: ฟังก์ชันปรับแต่งเช่น
USERELATIONSHIP, CROSSFILTER, ALL* ถูกประเมิน
- Apply Filters: นำผลลัพธ์จากข้อ 1 มาใช้กับ Filter Context (โดยปกติจะใช้ AND Logic และ Overwrite ตัวกรองที่มีอยู่ในคอลัมน์เดียวกัน)
- Evaluate Expression: สุดท้าย จึงคำนวณ Expression หลักภายใต้บริบทใหม่ที่สมบูรณ์แล้ว