ตัวอย่างที่ 1: พื้นฐานการกรองตาราง (Table Filtering)
Red Products Table =
CALCULATETABLE(
'Product',
'Product'[Color] = "Red")
)
ตาราง Product ทั้งใบ ที่เหลือเฉพาะสินค้าสีแดง
เหมือน CALCULATE แต่คืนค่าเป็นตาราง (Table) ใช้สำหรับเตรียมข้อมูลให้ Iterator หรือสร้างตารางใหม่
ฝาแฝดของ CALCULATE ที่คืนค่าเป็น ‘ตาราง’ ใช้ประเมิน Table Expression ภายใต้ Filter Context ที่ถูกปรับเปลี่ยน รองรับ Context Transition และ Filter Modifiers ทุกประการ
=CALCULATETABLE(TableExpression, [Filter1], [Filter2], ...)
=CALCULATETABLE(TableExpression, [Filter1], [Filter2], ...)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| TableExpression | table | Yes | นิพจน์ที่คืนค่าเป็นตาราง (เช่น ชื่อตาราง, VALUES(…), FILTER(…)) ซึ่งจะถูกประเมินภายใต้ Context ใหม่ | |
| Filter1, Filter2, … | table/boolean | Optional | เงื่อนไขการกรอง (Table หรือ Boolean) ทำงานเหมือนกับ CALCULATE ทุกประการ คือ Add, Overwrite หรือ Remove ตัวกรองเดิม |
ใช้ CALCULATETABLE เพื่อเตรียมตารางย่อยที่ซับซ้อน ส่งเข้า SUMX เพื่อคำนวณทีละแถว
การสร้างตารางชั่วคราวของลูกค้าที่มียอดซื้อตามเกณฑ์ เพื่อนำไปนับจำนวนหรือวิเคราะห์ต่อ
สร้าง Calculated Table ที่เก็บข้อมูลเฉพาะ ณ วันที่หรือสถานะหนึ่งๆ (Snapshot)
Red Products Table =
CALCULATETABLE(
'Product',
'Product'[Color] = "Red")
)
ตาราง Product ทั้งใบ ที่เหลือเฉพาะสินค้าสีแดง
Sales Last Year Table =
CALCULATETABLE(
Sales,
SAMEPERIODLASTYEAR( 'Date'[Date] ))
)
ตาราง Sales ของช่วงเวลาเดียวกันในปีที่แล้ว
Weighted Avg =
SUMX(
VALUES('Product'[Category]),
CALCULATE( [SalesAmount] ) -- Implicit Context Transition here
-- or if a more complex table is needed, use CALCULATETABLE instead
)
ค่าเฉลี่ยถ่วงน้ำหนักตาม Category
FILTER เป็น Iterator ที่สแกนตารางทีละแถวและตรวจสอบเงื่อนไข (ช้ากว่าในตารางใหญ่) แต่ CALCULATETABLE เปลี่ยน Filter Context ของ Data Model โดยตรง (เร็วกว่า) และรองรับฟังก์ชัน Modifier ขั้นสูงอย่าง USERELATIONHIP
ได้ และมันทำงานเหมือน CALCULATE คือแปลงเป็น FILTER(ALL(…)) เบื้องหลัง ดังนั้นระวังเรื่องการ Overwrite Filter เดิมโดยไม่ตั้งใจ
CALCULATETABLE คือฝาแฝดของ CALCULATE ที่ทำงานด้วยกลไกเดียวกันทุกประการ (Same Engine) แต่มีความแตกต่างเพียงอย่างเดียวคือ ผลลัพธ์ (Result) ที่ได้จะเป็น ตาราง (Table) แทนที่จะเป็นค่าสเกลาร์
เนื่องจากใช้ Engine เดียวกับ CALCULATE กฎทุกข้อจึงนำมาใช้ได้เหมือนกัน:
SUMX หรือ FILTER) จะเกิดการเปลี่ยนบริบทแถวปัจจุบันเป็นตัวกรองเราใช้ CALCULATETABLE เมื่อต้องการ “ตาราง” ที่ผ่านการกรองด้วยเงื่อนไขที่ซับซ้อน (ซึ่งฟังก์ชัน FILTER ธรรมดาอาจทำไม่ได้ หรือทำได้ยากกว่า เช่นการใช้ USERELATIONSHIP หรือการ Overwrite Filter เดิม)
ตัวอย่างสถานการณ์:
SUMX, AVERAGEX)TREATAS หรือ INTERSECT