ทำความเข้าใจและใช้งาน WITH ROLLUP ใน MySQL
WITH ROLLUP เป็นส่วนขยายของ GROUP BY ที่เพิ่มแถวสรุป (super-aggregate rows) เข้าไปในผลลัพธ์ โดยคำนวณผลรวมย่อย (subtotals) และผลรวมทั้งหมด (grand total) อัตโนมัติ
ไวยากรณ์พื้นฐาน
SELECT column1, SUM(column2)
FROM table_name
GROUP BY column1 WITH ROLLUP;
สร้างตารางและข้อมูลตัวอย่าง
mysql> create table DemoTable1622 (
-> EmployeeCountryName varchar(20),
-> EmployeeSalary int
-> );
Query OK, 0 rows affected (0.44 sec)
mysql> insert into DemoTable1622 values('US', 4500);
mysql> insert into DemoTable1622 values('UK', 1500);
mysql> insert into DemoTable1622 values('AUS', 1700);
mysql> insert into DemoTable1622 values('UK', 1900);
mysql> insert into DemoTable1622 values('US', 3900);
ข้อมูลต้นฉบับ
+---------------------+----------------+ | EmployeeCountryName | EmployeeSalary | +---------------------+----------------+ | US | 4500 | | UK | 1500 | | AUS | 1700 | | UK | 1900 | | US | 3900 | +---------------------+----------------+
คำสั่ง GROUP BY WITH ROLLUP
mysql> select EmployeeCountryName, sum(EmployeeSalary)
-> from DemoTable1622
-> group by EmployeeCountryName with rollup;
ผลลัพธ์
+---------------------+---------------------+ | EmployeeCountryName | sum(EmployeeSalary) | +---------------------+---------------------+ | AUS | 1700 | | UK | 3400 | | US | 8400 | | NULL | 13500 | +---------------------+---------------------+
อธิบายผลลัพธ์
- แถว 1-3: ผลรวมเงินเดือนตามแต่ละประเทศ (Subtotals)
- แถว 4 (
NULL): ผลรวมทั้งหมด (Grand Total) = 1700 + 3400 + 8400 = 13500
การระบุแถวสรุปด้วย GROUPING()
ใน MySQL 8.0+ สามารถใช้ฟังก์ชัน GROUPING() เพื่อแยกแยะแถวข้อมูลทั่วไปและแถวสรุป:
SELECT EmployeeCountryName, SUM(EmployeeSalary) AS TotalSalary, GROUPING(EmployeeCountryName) AS IsTotal FROM DemoTable1622 GROUP BY EmployeeCountryName WITH ROLLUP;
ผลลัพธ์: IsTotal = 0 สำหรับแถวปกติ, 1 สำหรับแถว Grand Total
กรณี GROUP BY หลายคอลัมน์
SELECT Country, Department, SUM(Salary)
FROM Employees
GROUP BY Country, Department WITH ROLLUP;
จะสร้าง subtotal ต่อ Department ภายใน Country และ Grand Total ท้ายสุด
ข้อจำกัด: WITH ROLLUP ไม่รองรับ ORDER BY โดยตรง ต้องห่อด้วย subquery หรือใช้ GROUPING() เพื่อจัดลำดับ