Thep Excel

CALCULATETABLE – สร้างตารางใหม่ภายใต้เงื่อนไขที่กำหนด

เหมือน CALCULATE แต่คืนค่าเป็นตาราง (Table) ใช้สำหรับเตรียมข้อมูลให้ Iterator หรือสร้างตารางใหม่

ฝาแฝดของ CALCULATE ที่คืนค่าเป็น ‘ตาราง’ ใช้ประเมิน Table Expression ภายใต้ Filter Context ที่ถูกปรับเปลี่ยน รองรับ Context Transition และ Filter Modifiers ทุกประการ

=CALCULATETABLE(TableExpression, [Filter1], [Filter2], ...)

By ThepExcel AI Agent
2 December 2025

Syntax & Arguments

=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 ตัวกรองเดิม

How it works

Advanced Iteration with Context Transition

ใช้ CALCULATETABLE เพื่อเตรียมตารางย่อยที่ซับซ้อน ส่งเข้า SUMX เพื่อคำนวณทีละแถว

Dynamic Segmentation

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

Snapshot Table Creation

สร้าง Calculated Table ที่เก็บข้อมูลเฉพาะ ณ วันที่หรือสถานะหนึ่งๆ (Snapshot)

Examples

ตัวอย่างที่ 1: พื้นฐานการกรองตาราง (Table Filtering)

เหมือนกับการใช้ FILTER('Product', 'Product'[Color]="Red") แต่เร็วกว่าและจัดการ Context ได้ดีกว่าถ้ามีเงื่อนไขซ้อนทับกัน
DAX Formula:

Red Products Table = 
CALCULATETABLE(
    'Product',
    'Product'[Color] = "Red")
)

Result:

ตาราง Product ทั้งใบ ที่เหลือเฉพาะสินค้าสีแดง

ตัวอย่างที่ 2: การใช้ร่วมกับ Time Intelligence (Date Shifting)

นี่คือสิ่งที่ CALCULATETABLE ทำได้แต่ FILTER ทำไม่ได้ คือการใช้ฟังก์ชัน Time Intelligence (ซึ่งคืนค่าเป็นตารางวันที่) มาเป็นตัวกรองเพื่อเปลี่ยนช่วงเวลาของตารางผลลัพธ์
DAX Formula:

Sales Last Year Table = 
CALCULATETABLE(
    Sales,
    SAMEPERIODLASTYEAR( 'Date'[Date] ))
)

Result:

ตาราง Sales ของช่วงเวลาเดียวกันในปีที่แล้ว

ตัวอย่างที่ 3: Context Transition ภายใน SUMX

ตัวอย่างนี้แสดงให้เห็นว่าเมื่อเราต้องการตาราง (VALUES) มาวนลูป เรามักใช้คู่กับ CALCULATE/CALCULATETABLE เพื่อให้เกิด Context Transition ในการดึงค่าที่ถูกต้องของแต่ละรอบลูป
DAX Formula:

Weighted Avg = 
SUMX(
    VALUES('Product'[Category]),
    CALCULATE( [SalesAmount] ) -- Implicit Context Transition here
    -- or if a more complex table is needed, use CALCULATETABLE instead
)

Result:

ค่าเฉลี่ยถ่วงน้ำหนักตาม Category

FAQs

ต่างกับ FILTER อย่างไร?

FILTER เป็น Iterator ที่สแกนตารางทีละแถวและตรวจสอบเงื่อนไข (ช้ากว่าในตารางใหญ่) แต่ CALCULATETABLE เปลี่ยน Filter Context ของ Data Model โดยตรง (เร็วกว่า) และรองรับฟังก์ชัน Modifier ขั้นสูงอย่าง USERELATIONHIP

สามารถใช้ Boolean Filter กับ CALCULATETABLE ได้ไหม?

ได้ และมันทำงานเหมือน CALCULATE คือแปลงเป็น FILTER(ALL(…)) เบื้องหลัง ดังนั้นระวังเรื่องการ Overwrite Filter เดิมโดยไม่ตั้งใจ

Resources & Related

Additional Notes

CALCULATETABLE คือฝาแฝดของ CALCULATE ที่ทำงานด้วยกลไกเดียวกันทุกประการ (Same Engine) แต่มีความแตกต่างเพียงอย่างเดียวคือ ผลลัพธ์ (Result) ที่ได้จะเป็น ตาราง (Table) แทนที่จะเป็นค่าสเกลาร์

กลไกการทำงาน (Internal Behavior)

เนื่องจากใช้ Engine เดียวกับ CALCULATE กฎทุกข้อจึงนำมาใช้ได้เหมือนกัน:

  • Filter Arguments are Tables: เงื่อนไขการกรองทุกตัวจะถูกแปลงเป็นตารางเพื่อนำไป Apply กับ Data Model
  • Context Transition: หากเรียกใช้ใน Row Context (เช่น ภายใน SUMX หรือ FILTER) จะเกิดการเปลี่ยนบริบทแถวปัจจุบันเป็นตัวกรอง
  • Order of Evaluation: ลำดับการประเมินเหมือนกันเป๊ะ (Filter Args -> Context Transition -> Modifiers -> Apply Filters -> Evaluate Table Expression)

เมื่อไหร่ควรใช้ CALCULATETABLE?

เราใช้ CALCULATETABLE เมื่อต้องการ “ตาราง” ที่ผ่านการกรองด้วยเงื่อนไขที่ซับซ้อน (ซึ่งฟังก์ชัน FILTER ธรรมดาอาจทำไม่ได้ หรือทำได้ยากกว่า เช่นการใช้ USERELATIONSHIP หรือการ Overwrite Filter เดิม)

ตัวอย่างสถานการณ์:

  • ต้องการส่งตารางที่กรองแล้วไปให้ Iterator Function (เช่น SUMX, AVERAGEX)
  • ต้องการสร้าง Calculated Table ใหม่ใน Model
  • ต้องการดึงรายการค่า (List of Values) ที่ไม่ซ้ำกันภายใต้เงื่อนไขเฉพาะ เพื่อนำไปใช้ใน TREATAS หรือ INTERSECT

Leave a Reply

Your email address will not be published. Required fields are marked *