SUMMARIZECOLUMNS เป็นฟังก์ชันหลักสำหรับสร้างตารางสรุปผล โดยจัดกลุ่มตามคอลัมน์ที่กำหนด พร้อมเพิ่มคอลัมน์คำนวณจากเมเชอร์ และสามารถใส่เงื่อนไขกรองได้ทันที
=SUMMARIZECOLUMNS( <groupBy_columnName> [, <filterTable>] [, <name>, <expression>] )
=SUMMARIZECOLUMNS( <groupBy_columnName> [, <filterTable>] [, <name>, <expression>] )
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| groupBy_columnName | Column | Yes | คอลัมน์สำหรับจัดกลุ่ม (Group By) ต้องระบุแบบ Fully Qualified เช่น Table[Column] สามารถระบุได้หลายคอลัมน์ แต่ห้ามซ้ำกัน (แต่ละคอลัมน์จะถูก Cross-Join ถ้าต่างตาราง หรือ Auto-Exist ถ้าตารางเดียวกัน) | |
| filterTable | Table | Optional | ตารางเงื่อนไขที่ใช้กรองบริบทก่อนทำการ Group By สามารถใช้ฟังก์ชันอย่าง FILTER, TREATAS, KEEPFILTERS, REMOVEFILTERS, NONVISUAL ได้ | |
| name | Text | Optional | ชื่อคอลัมน์ใหม่ที่ต้องการเพิ่มในตารางผลลัพธ์ (จับคู่กับ expression) | |
| expression | Expression | Optional | นิพจน์ DAX ที่คืนค่าเดี่ยว (ไม่ใช่ตาราง) สำหรับคำนวณค่าในคอลัมน์ใหม่ สามารถระบุได้หลายคู่ name/expression |
สร้างตารางผลรวมตามมิติที่ต้องการ แล้วใช้ EVALUATE เพื่อดูผลลัพธ์ หรือส่งต่อให้ฟังก์ชันอื่น
ใส่ตารางเงื่อนไขเพื่อกำหนดว่าให้สรุปเฉพาะบางกลุ่ม/บางค่าที่สนใจ
EVALUATE SUMMARIZECOLUMNS( 'Product'[Category], "Total Sales", SUM(Sales[Amount]) )=EVALUATE
SUMMARIZECOLUMNS(
'Product'[Category],
"Total Sales", SUM(Sales[Amount])
)
ตารางที่มี 2 คอลัมน์: Category และ Total Sales แสดงยอดขายรวมของแต่ละหมวด
EVALUATE SUMMARIZECOLUMNS( 'Product'[Category], 'Date'[Year], "Total Sales", [Sales Amount], "Total Quantity", SUM(Sales[Quantity]) )=EVALUATE
SUMMARIZECOLUMNS(
'Product'[Category],
'Date'[Year],
"Total Sales", [Sales Amount],
"Total Quantity", SUM(Sales[Quantity])
)
ตารางที่แสดงยอดขายและจำนวนสินค้าตามหมวดสินค้า x ปี
EVALUATE SUMMARIZECOLUMNS( 'Product'[Category], TREATAS({"Bikes", "Accessories"}, 'Product'[Category]), "Sales", [Sales Amount] )=EVALUATE
SUMMARIZECOLUMNS(
'Product'[Category],
TREATAS({"Bikes", "Accessories"}, 'Product'[Category]),
"Sales", [Sales Amount]
)
แสดงเฉพาะหมวด Bikes และ Accessories พร้อมยอดขาย
EVALUATE SUMMARIZECOLUMNS( 'Product'[Category], 'Customer'[Education], FILTER('Customer', 'Customer'[FirstName] = "John"), "Sales", [Sales Amount] )=EVALUATE
SUMMARIZECOLUMNS(
'Product'[Category],
'Customer'[Education],
FILTER('Customer', 'Customer'[FirstName] = "John"),
"Sales", [Sales Amount]
)
สรุปยอดขายตามหมวดสินค้าและระดับการศึกษาของลูกค้าที่ชื่อ John
EVALUATE SUMMARIZECOLUMNS( ROLLUPADDISSUBTOTAL('Product'[Category], "IsSubtotal"), "Total Sales", SUM(Sales[Amount]) )=EVALUATE
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL('Product'[Category], "IsSubtotal"),
"Total Sales", SUM(Sales[Amount])
)
ตารางที่แสดงยอดขายแต่ละหมวด พร้อมแถว Grand Total (IsSubtotal = TRUE)
EVALUATE SUMMARIZECOLUMNS( 'Date'[CalendarYear], NONVISUAL(TREATAS({2023, 2024}, 'Date'[CalendarYear])), "Sales", [Sales Amount], "All Years Sales", CALCULATE([…=EVALUATE
SUMMARIZECOLUMNS(
'Date'[CalendarYear],
NONVISUAL(TREATAS({2023, 2024}, 'Date'[CalendarYear])),
"Sales", [Sales Amount],
"All Years Sales", CALCULATE([Sales Amount], ALLSELECTED('Date'[CalendarYear]))
)
แสดงยอดขายปี 2023-2024 พร้อมคอลัมน์ที่แสดงยอดรวมทุกปี
EVALUATE SUMMARIZECOLUMNS( 'Product'[Category], "High Value Sales", IF(SUM(Sales[Amount]) > 100000, SUM(Sales[Amount])) )=EVALUATE
SUMMARIZECOLUMNS(
'Product'[Category],
"High Value Sales", IF(SUM(Sales[Amount]) > 100000, SUM(Sales[Amount]))
)
แสดงเฉพาะหมวดที่มียอดขายเกิน 100,000 (หมวดที่น้อยกว่าจะไม่แสดงเพราะ IF คืน BLANK)
SUMMARIZECOLUMNS เป็นฟังก์ชันใหม่กว่าและออกแบบมาสำหรับการสร้างตารางสรุปโดยเฉพาะ มีประสิทธิภาพดีกว่า SUMMARIZE และรองรับ Filter Table, ROLLUP และ Context Transition ได้ดีกว่า แนะนำให้ใช้ SUMMARIZECOLUMNS แทน SUMMARIZE ในทุกกรณีที่ทำได้
SUMMARIZECOLUMNS จะคืนเฉพาะแถวที่มีอย่างน้อยหนึ่ง Expression คืนค่าไม่เป็น BLANK ถ้าทุก Expression เป็น BLANK แถวนั้นจะถูกตัดออก ถ้าต้องการให้แสดงทุกแถว ให้ใช้ IGNORE() ห่อ Expression ที่อาจเป็น BLANK
ได้ครับ ตั้งแต่ DAX 2024 (June 2024 Update) ขึ้นไป SUMMARIZECOLUMNS รองรับ Context Transition ใน Measure แล้ว แต่ต้องระวังเรื่อง Performance เพราะ SUMMARIZECOLUMNS จะสร้างตารางทั้งหมดทุกครั้งที่ Evaluate
Filter Table จะถูกนำไปใช้กรอง Filter Context ก่อนทำการ Cross-Join/Auto-Exist ของ GroupBy Columns แต่ตาม SelfValue Semantics (2024+) Filter จากตารางภายนอกจะไม่มีผลกับ GroupBy Columns ยกเว้นว่าคอลัมน์นั้นอยู่ในตารางเดียวกับ Filter หรือเป็น GroupBy Column เอง
รองรับแต่มีข้อจำกัด คือใช้ใน Calculated Column หรือ RLS Rules ไม่ได้ แต่ใช้ใน Measure และ Calculated Table ได้ปกติ
เพิ่มแถว Subtotal/Grand Total ในตารางผลลัพธ์โดยอัตโนมัติ พร้อมเพิ่มคอลัมน์ Boolean เพื่อระบุว่าแถวไหนเป็น Subtotal (TRUE) หรือรายละเอียด (FALSE) เหมาะสำหรับสร้างรายงานที่ต้องการ Summary ทุกระดับ
SUMMARIZECOLUMNS เป็นฟังก์ชันสำหรับสร้างตารางสรุปผล (summary table) แบบ Dynamic โดยการจัดกลุ่มตามคอลัมน์ที่ระบุ พร้อมเพิ่มคอลัมน์คำนวณจากนิพจน์หรือเมเชอร์ และที่เจ๋งคือสามารถใส่ตารางเงื่อนไข (filter table) เพื่อจำกัดบริบทได้ทันทีโดยไม่ต้องห่อด้วย CALCULATE
ฟังก์ชันนี้ทำงานได้ทั้งใน Calculated Table, Measure และ Calculated Column (ยกเว้น DirectQuery) และเป็นฟังก์ชันหลักที่ใช้สำหรับ Query DAX ใน DAX Studio หรือ Power BI Report Builder
ที่น่าสนใจคือ SUMMARIZECOLUMNS มีฟีเจอร์พิเศษคือสามารถสร้าง Subtotal/Rollup ได้โดยใช้ ROLLUPADDISSUBTOTAL และควบคุมระดับการ Rollup ด้วย ROLLUPGROUP
ส่วนตัวผมคิดว่า SUMMARIZECOLUMNS เป็นฟังก์ชันที่ทรงพลังมาก แต่ก็ซับซ้อนพอสมควร โดยเฉพาะเรื่อง Filter Context และ Auto-Exists Behavior ถ้าจะใช้ให้เก่ง แนะนำให้เข้าใจหลักการ Filter Context และ Lineage ของ DAX ให้ดีก่อน 😎