TREATAS เป็นเสมือนการสร้าง “virtual relationship” โดยไม่ต้องแก้โมเดล ช่วยให้ส่งเงื่อนไขข้ามตารางที่ไม่เชื่อมกัน หรือเมื่อต้องการส่งหลายคีย์พร้อมกัน
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| table_expression | Table | ตาราง/นิพจน์ที่จะใช้เป็นแหล่งค่า (เช่น VALUES() หรือ SUMMARIZE() ที่คืนตาราง) |
| column | Column | คอลัมน์ปลายทาง (target column) ที่จะถูกจำกัดด้วยค่าจาก table_expression สามารถระบุ 2-3 คอลัมน์เพื่อส่งหลายคีย์ (compound key) พร้อมกัน |
TREATAS ทำหน้าที่ “ทำความเป็นตัวแทน” ให้กับคอลัมน์หนึ่ง ว่าเป็นคอลัมน์อีกตัวหนึ่งเพื่อให้ filter ทะลุข้ามตาราง โดยไม่ต้องสร้าง relationship จริง.
สิ่งที่เจ๋งของ TREATAS คือมันไม่สร้างการตัดทอนข้อมูล ถ้าค่าใน Expression ไม่อยู่ในคอลัมน์ปลายทาง มันแค่ไม่มีผลใช้ – ไม่ผิดพลาด 😎 ยิ่งไปกว่านั้น ถ้าคุณมีตาราง lookup ที่เลือกบางค่า TREATAS จะช่วยให้คุณส่งค่าที่เลือกไปจำกัดข้อมูลในตารางอื่นได้อย่างง่าย
เมื่อมีตาราง lookup แยกต่างหากและต้องการให้การเลือกใน slicer ไปจำกัดตาราง fact
ใช้ตารางที่มีหลายคอลัมน์ (เช่น ปี/เดือน) แล้วส่งไปจำกัดหลายคอลัมน์ในตารางปลายทาง
VALUES() ดึงค่า Category ที่ unique จาก ProductLookup แล้ว TREATAS ทำให้มันเป็นเงื่อนไขจำกัดบน Product[Category] ได้ แม้ ProductLookup ไม่มี relationship กับ Sales
{} bracket สร้าง list ของค่า TREATAS นำค่า 3 สีนี้ไปจำกัด Product[Color] ง่ายกว่า FILTER และเร็วกว่า
SUMMARIZE() คืนตาราง 2 คอลัมน์ (Year, Month) และ TREATAS จับคู่กับ Date[Year] กับ Date[Month] พร้อมกัน ใช้ VAR เพื่อความชัดเจน
TREATAS ปกติจะ replace filter context (เช่น CALCULATE) แต่ KEEPFILTERS ทำให้มันทำงานร่วม (AND) แทน replace (OR)
ไม่ต้องตั้ง relationship ระหว่าง Customer และ RegionLookup ใช้ TREATAS ก็ได้ผล แถมสามารถเปลี่ยนค่า regionlookup ได้เลย
TREATAS ใช้เมื่อ: 1) ต้องส่งค่าจากตารางหนึ่งไปจำกัดอีกตารางที่ไม่เชื่อม 2) ต้องการ map columns (compound key) 3) ต้องการ performance ดี (ไม่ iterate). FILTER ใช้เมื่อต้องการเงื่อนไขที่ซับซ้อน หรือ iterate ทีละ row
USERELATIONSHIP ใช้เปิดความสัมพันธ์ที่มีอยู่แล้ว แต่อยู่ในสถานะ inactive (ระบุด้วย Relationship ID). TREATAS สร้างความสัมพันธ์เสมือน โดยไม่ต้องมี relationship จริงในโมเดล
ไม่เป็นไร ค่าที่ไม่อยู่จะถูกไม่สนใจ (ignored) TREATAS ไม่ผิดพลาด มันแค่ไม่ลบแถวใดๆ ก็ได้ เหมือนจำนวน intersection ของเซต
ได้ แต่มีข้อจำกัด ใช้ได้ใน Measure แต่ไม่ใช้ได้ใน Calculated Column หรือ RLS (Row-Level Security) ใน DirectQuery
ฟังก์ชันที่ผู้เขียนโยงไว้กับ TREATAS จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
INTERSECT คืนตารางของแถวที่อยู่ในทั้ง LeftTable และ RightTable เหมาะกับการหาสิ่งที่ซ้ำกัน/ร่วมกันระหว่างสองชุดข้อมูล โดยรักษาเอาแถวที่ซ้ำกันไว้ด้วย
NATURALJOINUSAGE ทำให้ table expression ถูกเพิ่มเข้าไปในตัวกรอง (filter context) แบบ natural join โดยจับคู่ตามคอลัมน์ชื่อเดียวกัน เป็นฟังก์ชันที่ออกแบบสำหรับการใช้งานขั้นสูงในโมเดลแบบประกอบ (composite models) และ SUMMARIZECOLUMNS
NONVISUAL ใช้ทำเครื่องหมายว่า filter expression นี้เป็น non-visual ซึ่งหมายความว่ามันจะส่งผลต่อการคำนวณ measure แต่จะไม่ไปทำให้แถวที่แสดงในตารางสรุปเปลี่ยนไป มักใช้ร่วมกับ SUMMARIZECOLUMNS เพื่อควบคุมพฤติกรรมของตัวกรองอย่างละเอียด
ROLLUP บอก SUMMARIZE ให้สร้างแถว subtotal เพิ่มเติมตามคอลัมน์ที่กำหนด ทำให้ได้ทั้งรายละเอียดและรวมย่อยในผลลัพธ์เดียว
ROLLUPADDISSUBTOTAL ใช้ใน SUMMARIZECOLUMNS เพื่อเพิ่มแถว roll-up/subtotal และเพิ่มคอลัมน์ IsSubtotal สำหรับแต่ละระดับที่กำหนด ทำให้แยกแถว subtotal ออกจากรายละเอียดได้ง่าย
ROLLUPGROUP ระบุชุดคอลัมน์ที่จะถูกพิจารณาเป็น “กลุ่มเดียว” สำหรับการสร้าง subtotal/roll-up ช่วยลด subtotal บางระดับ และมักใช้ร่วมกับ ROLLUP ใน SUMMARIZE
ROLLUPISSUBTOTAL ใช้ใน ADDMISSINGITEMS เพื่อจับคู่กลุ่ม roll-up กับคอลัมน์ IsSubtotal ที่สร้างจาก ROLLUPADDISSUBTOTAL ทำให้การเติมรายการที่ขาดหายทำงานได้ถูกต้องเมื่อมี roll-up/subtotal rows
คืนตารางย่อยจากตารางต้นทางโดยแบ่งแกน X เป็นช่วงเท่า ๆ กัน และคงแถวที่ให้ค่า Measure ต่ำสุด/สูงสุดในแต่ละช่วง (ต่อซีรีส์) เพื่อช่วยลดจำนวนจุดสำหรับการแสดงผล
คืนตารางที่เป็นผลแบบ semi-join ระหว่าง 2 ตาราง พร้อมแทนคอลัมน์ร่วมด้วยดัชนี 0-based ซึ่งคำนวณจากลำดับแถวของตารางอ้างอิงหลังจัดเรียง
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 เป็นฟังก์ชันหลักสำหรับสร้างตารางสรุปผล โดยจัดกลุ่มตามคอลัมน์ที่กำหนด พร้อมเพิ่มคอลัมน์คำนวณจากเมเชอร์ และสามารถใส่เงื่อนไขกรองได้ทันที
VALUES ดึงค่าที่ไม่ซ้ำจากคอลัมน์ หรือดึงแถวทั้งหมดจากตาราง โดยรวมแถว BLANK ที่เกิดจากข้อผิดพลาดของความสัมพันธ์ (Referential Integrity Violations) ส่วน DISTINCT จะไม่รวมแถว BLANK นี้
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 ใช้กรองแถวในตารางตามเงื่อนไขที่ซับซ้อน โดยวนลูปทุกแถวและประเมินเงื่อนไข เหมาะกับการกรองด้วย Measure หรือ Expression ซึ่ง Boolean Expression ทำไม่ได้ แต่ต้องระวังเรื่อง Performance เพราะเป็น Iterator Function ที่ช้ากว่า Boolean Expression ดังนั้นควรใช้เฉพาะเมื่อจำเป็น และอย่าใช้ FILTER กับ RELATED เพื่อกรองข้ามตาราง ให้กรองที่ Dimension Table โดยตรงแทน
KEEPFILTERS เป็นฟังก์ชันปรับตัวกรองที่ใช้ภายใน CALCULATE เพื่อ “คงตัวกรองเดิมไว้” แล้วนำตัวกรองใหม่มารวมกันแบบ AND (ตัดกันเฉพาะส่วนที่ตรงกัน) แทนพฤติกรรมปกติที่มักเขียนทับตัวกรองเดิมของคอลัมน์เดียวกัน
CONTAINS ค้นหาแถวในตารางและคืนค่า TRUE/FALSE เมื่อหาเจอค่าที่ตรงกับเงื่อนไขที่กำหนด เจ๋งเพราะมันเร็วกว่า COUNTROWS + FILTER มาก
USERELATIONSHIP ช่วยให้คุณใช้ relationship ที่ไม่ใช่ active หรือเปลี่ยน relationship ที่ใช้ในการคำนวณ เหมาะสำหรับสถานการณ์เช่น sales data ที่มีหลาย date columns (OrderDate, ShippingDate, DeliveryDate)
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่