Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách sử dụng MySQL Rollup

Đôi khi bạn có thể cần tính tổng và tổng phụ trong MySQL hoặc thêm tổng số hàng vào dữ liệu của mình. Có thể tẻ nhạt khi tổng hợp dữ liệu bằng cách sử dụng câu lệnh UNION, đặc biệt là để tính tổng phụ. MySQL Rollup phù hợp với các trường hợp sử dụng như vậy. Dưới đây là cách sử dụng MySQL Rollup để tính tổng và tổng phụ trong MySQL.

Cách sử dụng MySQL Rollup

Dưới đây là các bước để tính tổng và tổng phụ bằng MySQL Rollup.

MySQL Rollup cho phép bạn dễ dàng cuộn dữ liệu và tính tổng phụ bằng một câu lệnh duy nhất. Bạn cũng có thể sử dụng nó để thêm tổng các hàng và hàng tổng phụ vào dữ liệu của mình, thay vì tính toán chúng một cách riêng lẻ và kết hợp kết quả bằng cách sử dụng câu lệnh UNION.

Đây là cú pháp của MySQL ROLLUP.

SELECT 
    column1, column2, column3, ...
FROM 
    table_name
GROUP BY
    column1, column2,... WITH ROLLUP;

Truy vấn trên rất giống với việc tổng hợp dữ liệu bằng cách sử dụng câu lệnh GROUP BY, ngoại trừ việc bạn thêm từ khóa WITH ROLLUP sau mệnh đề GROUP BY.

Trong truy vấn trên, chúng tôi chỉ định các cột mà chúng tôi cần hiển thị trong kết quả truy vấn của chúng tôi trong mệnh đề SELECT. Chúng ta cũng cần phải đề cập đến tên bảng. Trong mệnh đề GROUP BY, chúng tôi chỉ định các cột dựa vào đó chúng tôi muốn tổng hợp dữ liệu.

Phần thưởng đọc:Cách kiểm tra phiên bản MySQL

Giả sử bạn có doanh số bán hàng trong bảng sau (order_date, sale).

mysql> create table sales(order_date date,sale int);
 
mysql> insert into sales values('2020-01-01',20),
('2020-01-02',25),('2020-01-03',15),('2020-01-04',30),
('2020-02-05',20),('2020-02-10',20),('2020-02-06',25),
('2020-03-07',15),('2020-03-08',30),('2020-03-09',20);
 
mysql> select * from sales;
+------------+------+
| order_date | sale |
+------------+------+
| 2020-01-01 |   20 |
| 2020-01-02 |   25 |
| 2020-01-03 |   15 |
| 2020-01-04 |   30 |
| 2020-02-05 |   20 |
| 2020-02-10 |   20 |
| 2020-02-06 |   25 |
| 2020-03-07 |   15 |
| 2020-03-08 |   30 |
| 2020-03-09 |   20 |
+------------+------+

Phần thưởng đã đọc:Cách tắt kiểm tra khóa ngoại trong MySQL

Đây là truy vấn SQL cho MySQL Rollup để tính toán tổng giá trị và thêm tổng hàng vào bảng. Tổng tổng luôn được thêm vào hàng cuối cùng, với cột GROUP BY được gán giá trị NULL.

mysql> select * from sales 
       group by order_date with rollup;
+------------+------+
| order_date | sale |
+------------+------+
| 2020-01-01 |   20 |
| 2020-01-02 |   25 |
| 2020-01-03 |   15 |
| 2020-01-04 |   30 |
| 2020-02-05 |   20 |
| 2020-02-06 |   25 |
| 2020-02-10 |   20 |
| 2020-03-07 |   15 |
| 2020-03-08 |   30 |
| 2020-03-09 |   20 |
| NULL       |   20 |
+------------+------+

Trong truy vấn trên, chúng tôi ROLLUP theo order_date cột.

Phần thưởng đọc:Cách tạo trình tự trong MySQL

Nếu bạn chỉ định nhiều hơn một cột trong mệnh đề GROUP BY, thì MySQL sẽ giả định một hệ thống phân cấp giữa chúng và dữ liệu cuộn lên tương ứng.

Ví dụ:nếu bạn đề cập đến

GROUP BY c1, c2, c3 WITH ROLLUP

thì MySQL sẽ giả sử

c1 > c2 > c3

Vì vậy, điều quan trọng là phải cẩn thận với thứ tự của các cột trong mệnh đề GROUP BY, khi sử dụng MySQL Rollup. Giả sử bạn có bảng sau.

mysql> create table sales(product varchar(255),order_date date,sale int);

mysql> insert into sales values('A','2020-01-01',20),('B','2020-01-02',25),
('B','2020-01-03',15),('A','2020-01-04',30),('A','2020-01-05',20);

mysql> select * from sales;
+---------+------------+------+
| product | order_date | sale |
+---------+------------+------+
| A       | 2020-01-01 |   20 |
| B       | 2020-01-02 |   25 |
| B       | 2020-01-03 |   15 |
| A       | 2020-01-04 |   30 |
| A       | 2020-01-05 |   20 |
+---------+------------+------+

Phần thưởng đọc:Cách so sánh hai bảng trong MySQL

Đây là truy vấn SQL để tổng hợp dữ liệu theo sản phẩm và cột order_date. Trong trường hợp này, MySQL sẽ không chỉ tính tổng tổng và hiển thị ở cuối mà còn tính tổng phụ theo từng cột cho mỗi cột được đề cập trong mệnh đề GROUP BY ngoại trừ cột cuối cùng, tức là chỉ sản phẩm cột.

mysql> select product,order_date,sum(sale) 
       from sales group by product,order_date with rollup;
+---------+------------+-----------+
| product | order_date | sum(sale) |
+---------+------------+-----------+
| A       | 2020-01-01 |        20 |
| A       | 2020-01-04 |        30 |
| A       | 2020-01-05 |        20 |
| A       | NULL       |        70 |
| B       | 2020-01-02 |        25 |
| B       | 2020-01-03 |        15 |
| B       | NULL       |        40 |
| NULL    | NULL       |       110 |
+---------+------------+-----------+

Trong kết quả trên, bạn sẽ thấy tổng theo sản phẩm và tổng lớn được đánh dấu là in đậm

Đây là kết quả nếu bạn đề cập đến order_date và sau đó là cột sản phẩm trong mệnh đề GROUP BY. Trong trường hợp này, MySQL sẽ tính toán tổng số order_date-khôn ngoan và tổng số tiền.

mysql> select product,order_date,sum(sale) 
       from sales group by order_date,product with rollup;	   

+---------+------------+-----------+
| product | order_date | sum(sale) |
+---------+------------+-----------+
| A       | 2020-01-01 |        20 |
| NULL    | 2020-01-01 |        20 |
| B       | 2020-01-02 |        25 |
| NULL    | 2020-01-02 |        25 |
| B       | 2020-01-03 |        15 |
| NULL    | 2020-01-03 |        15 |
| A       | 2020-01-04 |        30 |
| NULL    | 2020-01-04 |        30 |
| A       | 2020-01-05 |        20 |
| NULL    | 2020-01-05 |        20 |
| NULL    | NULL       |       110 |
+---------+------------+-----------+

Như bạn có thể thấy, kết quả sẽ khác nếu bạn thay đổi thứ tự của các cột được đề cập trong mệnh đề GROUP BY. Tuy nhiên, MySQL ROLLUP là một cách rất tiện lợi để nhanh chóng tính tổng phụ và cộng tổng hàng trong MySQL.

Ubiq giúp dễ dàng trực quan hóa dữ liệu trong vài phút và theo dõi trong trang tổng quan thời gian thực. Thử nó ngay hôm nay!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cài đặt nhiều phiên bản MySQL trên máy chủ Linux - sử dụng tệp cấu hình MySQL riêng biệt

  2. Chèn Blobs vào cơ sở dữ liệu MySql bằng php

  3. Tại sao MYSQL cao hơn LIMIT bù đắp làm chậm truy vấn?

  4. SQL tách các giá trị thành nhiều hàng

  5. Cách tạo mảng JSON từ cơ sở dữ liệu mysql