Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: การใช้ WITH ROLLUP เพื่อสรุปผลรวมแบบลำดับชั้น

ทำความเข้าใจและใช้งาน 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() เพื่อจัดลำดับ