ROLLUP บอก SUMMARIZE ให้สร้างแถว subtotal เพิ่มเติมตามคอลัมน์ที่กำหนด ทำให้ได้ทั้งรายละเอียดและรวมย่อยในผลลัพธ์เดียว
=ROLLUP(<GroupColumn>[, <GroupColumn>]...)
=ROLLUP(<GroupColumn>[, <GroupColumn>]...)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| GroupColumn | column | Yes | คอลัมน์ที่ต้องการสร้างแถว subtotal (ระบุได้หลายคอลัมน์ เรียงลำดับจากระดับสูงสุดไปต่ำสุด เช่น ปี แล้วเดือน) |
คืนทั้งแถวรายละเอียดและแถวรวมย่อยเพื่อเอาไปแสดงผล
ใช้ ISSUBTOTAL แยกแถว subtotal ออกจากแถวรายละเอียด
VAR SummaryTable = SUMMARIZE( Sales, 'Date'[Year], ROLLUP('Date'[Year]), "Total Amount", SUM(Sales[Amount]) ) RETURN SummaryTableVAR SummaryTable = SUMMARIZE(
Sales,
'Date'[Year],
ROLLUP('Date'[Year]),
"Total Amount", SUM(Sales[Amount])
)
RETURN SummaryTable
ตารางที่มีแถวแต่ละปี บวก 1 แถว subtotal ที่ Year = BLANK แสดงรวมทั้งหมด
VAR SummaryTable = SUMMARIZE( Sales, 'Date'[Year], 'Date'[Month], ROLLUP('Date'[Year], 'Date'[Month]), "Total Amount", SUM(Sales[Amount]), "Is Subtotal", ISSUBT…VAR SummaryTable = SUMMARIZE(
Sales,
'Date'[Year],
'Date'[Month],
ROLLUP('Date'[Year], 'Date'[Month]),
"Total Amount", SUM(Sales[Amount]),
"Is Subtotal", ISSUBTOTAL('Date'[Year])
)
RETURN SummaryTable
ตารางหลายระดับ: แถวรายละเอียด (2023, January), แถว subtotal ปี (2023, BLANK), แถว Grand Total (BLANK, BLANK)
VAR SummaryTable = SUMMARIZE( Sales, 'Date'[Year], Product[Category], ROLLUP('Date'[Year], Product[Category]), "Amount", SUM(Sales[Amount]), "Is Year Total", IS…VAR SummaryTable = SUMMARIZE(
Sales,
'Date'[Year],
Product[Category],
ROLLUP('Date'[Year], Product[Category]),
"Amount", SUM(Sales[Amount]),
"Is Year Total", ISSUBTOTAL('Date'[Year]),
"Is Category Total", ISSUBTOTAL(Product[Category])
)
RETURN SummaryTable
ตารางลำดับชั้น 3 ระดับ: รายละเอียด (Year, Category), subtotal ตามปี, subtotal ตามประเภท, grand total
VAR SummaryTable = SUMMARIZE( Sales, 'Date'[Year], 'Date'[Month], ROLLUP('Date'[Year], 'Date'[Month]), "Amount", SUM(Sales[Amount]), "Is Subtotal", ISSUBTOTAL('…VAR SummaryTable = SUMMARIZE(
Sales,
'Date'[Year],
'Date'[Month],
ROLLUP('Date'[Year], 'Date'[Month]),
"Amount", SUM(Sales[Amount]),
"Is Subtotal", ISSUBTOTAL('Date'[Year])
)
VAR FilteredTable = FILTER(
SummaryTable,
NOT([Is Subtotal])
)
RETURN FilteredTable
ตารางเฉพาะแถวรายละเอียด โดยตัดแถว subtotal ออก
ROLLUP ใช้เฉพาะภายใน SUMMARIZE เท่านั้น ไม่สามารถใช้กับ SUMMARIZECOLUMNS ได้
เพราะ ROLLUP ทำหน้าที่ “บอก” ว่าคอลัมน์ไหนควรสร้าง subtotal ถ้าคอลัมน์ที่ group ไม่อยู่ใน ROLLUP ก็จะไม่สร้าง subtotal ระดับนั้น ลำดับของ ROLLUP มีความสำคัญ – เรียงจากระดับ detail ไปรวม ทั่วไป
ROLLUP สร้างแถว subtotal โดยใช้ BLANK บอกตำแหน่ง ROLLUPADDISSUBTOTAL สร้างแถว subtotal และเพิ่มคอลัมน์ที่ทำให้รู้ว่าเป็น subtotal เลยตรงไหน (ด้วย marker อยู่ในคอลัมน์เดียว) แต่ ROLLUPADDISSUBTOTAL ใช้เฉพาะ SUMMARIZECOLUMNS
ค่า BLANK – ช่วยให้ ISSUBTOTAL รู้ว่าแถวไหนเป็น subtotal ถ้าคอลัมน์นั้นเป็น text ก็จะว่าง ถ้าเป็นตัวเลขก็เป็น 0 หรือ BLANK ขึ้นอยู่ context
ไม่ได้ ROLLUP รับเฉพาะคอลัมน์ (column reference) ไม่สามารถส่ง expression หรือ measure เข้าไป หากต้องการ subtotal ตามเงื่อนไข ต้องใช้ VAR + FILTER บนผลลัพธ์
ROLLUP เป็นฟังก์ชันพิเศษที่ใช้ภายใน SUMMARIZE เพื่อระบุว่า “คอลัมน์ใดควรสร้างแถว subtotal” ตัวอย่างเช่น ถ้าคุณ group by ปี และเดือน โดยธรรมชาติ SUMMARIZE จะได้แถวรายละเอียดเพียง (2023, January), (2023, February) เป็นต้น แต่ถ้าใส่ ROLLUP จะเพิ่มแถว subtotal อีก (2023, [blank]) สำหรับรวมปี 2023
ที่เจ๋งคือ ROLLUP ทำให้คุณได้ “pyramid of aggregation” – เห็นทั้งรายละเอียดขั้นละเอียด (month-level) และรวมระดับบน (year-level) ในตารางเดียว ถ้าไม่มี ROLLUP ต้องสร้าง SUMMARIZE หลายตัวแล้วรวมกัน
ส่วนตัวผมใช้ ROLLUP กับ ISSUBTOTAL ข้อคู่ – ROLLUP สร้างแถว ISSUBTOTAL บอกว่าแถวไหนเป็น subtotal ถึงจะควบคุมการ format/filter/คำนวณต่อได้ง่าย ประหยัด performance กว่าสร้าง SUMMARIZE หลายทีมากครับ