Thep Excel

TREATASส่งค่าข้ามตารางแบบเสมือน ไม่ต้องมี Relationship

TREATAS เป็นเสมือนการสร้าง “virtual relationship” โดยไม่ต้องแก้โมเดล ช่วยให้ส่งเงื่อนไขข้ามตารางที่ไม่เชื่อมกัน หรือเมื่อต้องการส่งหลายคีย์พร้อมกัน

fx
=TREATAS(table_expression, column, [column])

ความนิยม6/10
ความยาก6/10
ประโยชน์7/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
table_expression Table ตาราง/นิพจน์ที่จะใช้เป็นแหล่งค่า (เช่น VALUES() หรือ SUMMARIZE() ที่คืนตาราง)
column Column คอลัมน์ปลายทาง (target column) ที่จะถูกจำกัดด้วยค่าจาก table_expression สามารถระบุ 2-3 คอลัมน์เพื่อส่งหลายคีย์ (compound key) พร้อมกัน

Additional Notes

TREATAS ทำหน้าที่ “ทำความเป็นตัวแทน” ให้กับคอลัมน์หนึ่ง ว่าเป็นคอลัมน์อีกตัวหนึ่งเพื่อให้ filter ทะลุข้ามตาราง โดยไม่ต้องสร้าง relationship จริง.

สิ่งที่เจ๋งของ TREATAS คือมันไม่สร้างการตัดทอนข้อมูล ถ้าค่าใน Expression ไม่อยู่ในคอลัมน์ปลายทาง มันแค่ไม่มีผลใช้ – ไม่ผิดพลาด 😎 ยิ่งไปกว่านั้น ถ้าคุณมีตาราง lookup ที่เลือกบางค่า TREATAS จะช่วยให้คุณส่งค่าที่เลือกไปจำกัดข้อมูลในตารางอื่นได้อย่างง่าย

How it works

ส่งเงื่อนไขจากตารางที่ไม่ได้เชื่อม relationship

เมื่อมีตาราง lookup แยกต่างหากและต้องการให้การเลือกใน slicer ไปจำกัดตาราง fact

ส่งเงื่อนไขไปหลายคอลัมน์พร้อมกัน

ใช้ตารางที่มีหลายคอลัมน์ (เช่น ปี/เดือน) แล้วส่งไปจำกัดหลายคอลัมน์ในตารางปลายทาง

Examples

ตัวอย่างพื้นฐาน: ส่งค่า Category จาก Lookup ไปจำกัด SalesTotal Sales by Selected Categories = CALCULATE( SUM(Sales[Amount]), TREATAS( VALUES(ProductLookup[Category]), Product[Category] ) )

VALUES() ดึงค่า Category ที่ unique จาก ProductLookup แล้ว TREATAS ทำให้มันเป็นเงื่อนไขจำกัดบน Product[Category] ได้ แม้ ProductLookup ไม่มี relationship กับ Sales

fx
Total Sales by Selected Categories =
CALCULATE(
SUM(Sales[Amount]),
TREATAS(
VALUES(ProductLookup[Category]),
Product[Category]
)
)

ผลลัพธ์ยอดขายที่ match กับ Category ที่เลือกใน ProductLookup
ส่งค่าแบบ Hard-Coded (ไม่ใช่ dynamic)Sales for Red Blue White = CALCULATE( SUM(Sales[Amount]), TREATAS( {"Red", "Blue", "White"}, Product[Color] ) )

{} bracket สร้าง list ของค่า TREATAS นำค่า 3 สีนี้ไปจำกัด Product[Color] ง่ายกว่า FILTER และเร็วกว่า

fx
Sales for Red Blue White =
CALCULATE(
SUM(Sales[Amount]),
TREATAS(
{"Red", "Blue", "White"},
Product[Color]
)
)

ผลลัพธ์ยอดขายเฉพาะสีแดง น้ำเงิน และขาว
Compound Key: ส่งปี-เดือนพร้อมกันSales by Period Selected = VAR SelectedPeriods = SUMMARIZE(DateLookup, DateLookup[Year], DateLookup[Month]) RETURN CALCULATE( SUM(Sales[Amount]), TREATAS( Selec…

SUMMARIZE() คืนตาราง 2 คอลัมน์ (Year, Month) และ TREATAS จับคู่กับ Date[Year] กับ Date[Month] พร้อมกัน ใช้ VAR เพื่อความชัดเจน

fx
Sales by Period Selected =
VAR SelectedPeriods = SUMMARIZE(DateLookup, DateLookup[Year], DateLookup[Month])
RETURN
CALCULATE(
SUM(Sales[Amount]),
TREATAS(
SelectedPeriods,
Date[Year],
Date[Month]
)
)

ผลลัพธ์ยอดขายจะถูกจำกัดให้ตรงกับปี-เดือนที่เลือก
ใช้ร่วมกับ KEEPFILTERS เพื่อไม่ให้ลบเงื่อนไขเดิมSales Intersected = CALCULATE( SUM(Sales[Amount]), KEEPFILTERS( TREATAS( VALUES(Lookup[ProductCode]), Product[Code] ) ) )

TREATAS ปกติจะ replace filter context (เช่น CALCULATE) แต่ KEEPFILTERS ทำให้มันทำงานร่วม (AND) แทน replace (OR)

fx
Sales Intersected =
CALCULATE(
SUM(Sales[Amount]),
KEEPFILTERS(
TREATAS(
VALUES(Lookup[ProductCode]),
Product[Code]
)
)
)

ผลลัพธ์ยอดขายตัดกับเงื่อนไข Lookup และเงื่อนไขเดิมจาก slicer
นับ Customers ที่ตรงกับ Selected RegionsCount Customers in Selected Regions = CALCULATE( DISTINCTCOUNT(Customer[ID]), TREATAS( VALUES(RegionLookup[RegionName]), Customer[Region] ) )

ไม่ต้องตั้ง relationship ระหว่าง Customer และ RegionLookup ใช้ TREATAS ก็ได้ผล แถมสามารถเปลี่ยนค่า regionlookup ได้เลย

fx
Count Customers in Selected Regions =
CALCULATE(
DISTINCTCOUNT(Customer[ID]),
TREATAS(
VALUES(RegionLookup[RegionName]),
Customer[Region]
)
)

ผลลัพธ์จำนวน unique customers ใน region ที่เลือก

FAQs

TREATAS vs FILTER – เมื่อไหร่ใช้ตัวไหน?+

TREATAS ใช้เมื่อ: 1) ต้องส่งค่าจากตารางหนึ่งไปจำกัดอีกตารางที่ไม่เชื่อม 2) ต้องการ map columns (compound key) 3) ต้องการ performance ดี (ไม่ iterate). FILTER ใช้เมื่อต้องการเงื่อนไขที่ซับซ้อน หรือ iterate ทีละ row

TREATAS vs USERELATIONSHIP ต่างกันอย่างไร?+

USERELATIONSHIP ใช้เปิดความสัมพันธ์ที่มีอยู่แล้ว แต่อยู่ในสถานะ inactive (ระบุด้วย Relationship ID). TREATAS สร้างความสัมพันธ์เสมือน โดยไม่ต้องมี relationship จริงในโมเดล

ถ้าค่าใน Expression ไม่อยู่ในคอลัมน์ปลายทาง จะเกิดอะไร?+

ไม่เป็นไร ค่าที่ไม่อยู่จะถูกไม่สนใจ (ignored) TREATAS ไม่ผิดพลาด มันแค่ไม่ลบแถวใดๆ ก็ได้ เหมือนจำนวน intersection ของเซต

TREATAS สนับสนุน DirectQuery ไหม?+

ได้ แต่มีข้อจำกัด ใช้ได้ใน Measure แต่ไม่ใช้ได้ใน Calculated Column หรือ RLS (Row-Level Security) ใน DirectQuery

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ TREATAS จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้TREATASTable manipulation
Table manipulation (12)
INTERSECT

INTERSECT คืนตารางของแถวที่อยู่ในทั้ง LeftTable และ RightTable เหมาะกับการหาสิ่งที่ซ้ำกัน/ร่วมกันระหว่างสองชุดข้อมูล โดยรักษาเอาแถวที่ซ้ำกันไว้ด้วย

NATURALJOINUSAGE

NATURALJOINUSAGE ทำให้ table expression ถูกเพิ่มเข้าไปในตัวกรอง (filter context) แบบ natural join โดยจับคู่ตามคอลัมน์ชื่อเดียวกัน เป็นฟังก์ชันที่ออกแบบสำหรับการใช้งานขั้นสูงในโมเดลแบบประกอบ (composite models) และ SUMMARIZECOLUMNS

NONVISUAL

NONVISUAL ใช้ทำเครื่องหมายว่า filter expression นี้เป็น non-visual ซึ่งหมายความว่ามันจะส่งผลต่อการคำนวณ measure แต่จะไม่ไปทำให้แถวที่แสดงในตารางสรุปเปลี่ยนไป มักใช้ร่วมกับ SUMMARIZECOLUMNS เพื่อควบคุมพฤติกรรมของตัวกรองอย่างละเอียด

ROLLUP

ROLLUP บอก SUMMARIZE ให้สร้างแถว subtotal เพิ่มเติมตามคอลัมน์ที่กำหนด ทำให้ได้ทั้งรายละเอียดและรวมย่อยในผลลัพธ์เดียว

ROLLUPADDISSUBTOTAL

ROLLUPADDISSUBTOTAL ใช้ใน SUMMARIZECOLUMNS เพื่อเพิ่มแถว roll-up/subtotal และเพิ่มคอลัมน์ IsSubtotal สำหรับแต่ละระดับที่กำหนด ทำให้แยกแถว subtotal ออกจากรายละเอียดได้ง่าย

ROLLUPGROUP

ROLLUPGROUP ระบุชุดคอลัมน์ที่จะถูกพิจารณาเป็น “กลุ่มเดียว” สำหรับการสร้าง subtotal/roll-up ช่วยลด subtotal บางระดับ และมักใช้ร่วมกับ ROLLUP ใน SUMMARIZE

ROLLUPISSUBTOTAL

ROLLUPISSUBTOTAL ใช้ใน ADDMISSINGITEMS เพื่อจับคู่กลุ่ม roll-up กับคอลัมน์ IsSubtotal ที่สร้างจาก ROLLUPADDISSUBTOTAL ทำให้การเติมรายการที่ขาดหายทำงานได้ถูกต้องเมื่อมี roll-up/subtotal rows

SAMPLEAXISWITHLOCALMINMAX

คืนตารางย่อยจากตารางต้นทางโดยแบ่งแกน X เป็นช่วงเท่า ๆ กัน และคงแถวที่ให้ค่า Measure ต่ำสุด/สูงสุดในแต่ละช่วง (ต่อซีรีส์) เพื่อช่วยลดจำนวนจุดสำหรับการแสดงผล

SUBSTITUTEWITHINDEX

คืนตารางที่เป็นผลแบบ semi-join ระหว่าง 2 ตาราง พร้อมแทนคอลัมน์ร่วมด้วยดัชนี 0-based ซึ่งคำนวณจากลำดับแถวของตารางอ้างอิงหลังจัดเรียง

SUMMARIZE

SUMMARIZE สร้างตารางสรุปโดยจัดกลุ่มข้อมูลตามคอลัมน์ที่กำหนด คล้าย GROUP BY ใน SQL หรือ Pivot Table ใน Excel คืนค่าตารางที่มีหนึ่งแถวต่อหนึ่ง unique combination ของคอลัมน์ที่เลือก สามารถอ้างถึงคอลัมน์จาก related table ได้โดยตรงโดยไม่ต้องใช้ RELATED มักใช้สร้าง virtual table ใน measure เพื่อทำ intermediate calculations ก่อนใช้ iterator functions อย่าง SUMX, AVERAGEX คำนวณต่อ ⚠️ Best Practice: ใช้ ADDCOLUMNS ครอบ SUMMARIZE แทนการใส่ extension columns ตรงๆ เพื่อ performance และ filter context control ที่ดีกว่า สำหรับ calculated table แนะนำใช้ SUMMARIZECOLUMNS แทนเนื่องจากมี performance ดีกว่าอย่างมาก

SUMMARIZECOLUMNS

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

VALUES

VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้

Filter (3)
CALCULATE

CALCULATE เป็นฟังก์ชันหลักที่สำคัญที่สุดใน DAX ใช้สำหรับ evaluate expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน สามารถเพิ่มตัวกรองใหม่ ลบตัวกรองเดิม หรือแทนที่ filter ที่มีอยู่ได้ รองรับทั้ง Boolean expression และ table expression เป็น filter arguments พร้อม filter modifier functions เช่น REMOVEFILTERS, ALL, ALLEXCEPT, KEEPFILTERS เพื่อควบคุมการกรองอย่างละเอียด มีพฤติกรรมพิเศษคือ context transition ที่เปลี่ยน row context เป็น filter context โดยอัตโนมัติ ทำให้เป็นเครื่องมือหลักในการสร้าง measure ที่ซับซ้อนและ calculated column ที่ต้องใช้ aggregation

FILTER

FILTER ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน

KEEPFILTERS

KEEPFILTERS เป็นฟังก์ชันปรับตัวกรองที่ใช้ภายใน CALCULATE เพื่อ “คงตัวกรองเดิมไว้” แล้วนำตัวกรองใหม่มารวมกันแบบ AND (ตัดกันเฉพาะส่วนที่ตรงกัน) แทนพฤติกรรมปกติที่มักเขียนทับตัวกรองเดิมของคอลัมน์เดียวกัน

Information (1)
CONTAINS

CONTAINS ค้นหาแถวในตารางและคืนค่า TRUE/FALSE เมื่อหาเจอค่าที่ตรงกับเงื่อนไขที่กำหนด เจ๋งเพราะมันเร็วกว่า COUNTROWS + FILTER มาก

Relationship (1)
USERELATIONSHIP

USERELATIONSHIP ช่วยให้คุณใช้ relationship ที่ไม่ใช่ active หรือเปลี่ยน relationship ที่ใช้ในการคำนวณ เหมาะสำหรับสถานการณ์เช่น sales data ที่มีหลาย date columns (OrderDate, ShippingDate, DeliveryDate)

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่