×

Tạo nhóm dữ liệu với hàm GROUPING() trong MySQL

Trong quá trình làm việc với cơ sở dữ liệu, việc nhóm các dữ liệu để phân tích và báo cáo là một việc thường xuyên diễn ra. Trong MySQL, hàm GROUPING() được sử dụng để hỗ trợ quá trình nhóm dữ liệu, giúp dễ dàng nhận biết những tập hợp con (subsets) trong dữ liệu nhóm. Bài viết này sẽ giới thiệu cách sử dụng hàm GROUPING() trong MySQL để tạo ra các nhóm dữ liệu một cách hiệu quả.

Tổng quan về hàm GROUPING()

Hàm GROUPING() trong MySQL được sử dụng kết hợp với câu lệnh GROUP BY để xác định liệu một hàng trong kết quả truy vấn có phải là kết quả của một tập hợp con hay không. Kết quả của hàm GROUPING() là 0 hoặc 1, trong đó:

  • Kết quả là 0 khi hàng không phải là kết quả của một tập hợp con.
  • Kết quả là 1 khi hàng là kết quả của một tập hợp con.

Cấu trúc của hàm GROUPING()

Cấu trúc của hàm GROUPING() rất đơn giản:

GROUPING(column_name)

Ví dụ minh họa

Để hiểu rõ hơn về cách sử dụng hàm GROUPING(), chúng ta sẽ đi qua một ví dụ thực tế. Giả sử chúng ta có bảng sales chứa thông tin về doanh thu bán hàng như sau:

CREATE TABLE sales (
  id INT AUTO_INCREMENT PRIMARY KEY,
  product_name VARCHAR(255),
  sales_year INT,
  sales_amount DECIMAL(10, 2)
);

INSERT INTO sales (product_name, sales_year, sales_amount) VALUES
('Product A', 2021, 1500.00),
('Product A', 2022, 2000.00),
('Product B', 2021, 1000.00),
('Product B', 2022, 2500.00);

Sử dụng GROUP BY để nhóm dữ liệu

Trước hết, chúng ta thực hiện nhóm dữ liệu theo sản phẩm và năm bán hàng:

SELECT product_name, sales_year, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY product_name, sales_year;

Kết quả:

product_name sales_year total_sales
Product A 2021 1500.00
Product A 2022 2000.00
Product B 2021 1000.00
Product B 2022 2500.00

Sử dụng ROLLUP và GROUPING()

Để có thêm các tổng số phụ (subtotals) và tổng số lớn (grand totals), chúng ta có thể sử dụng kết hợp chức năng ROLLUP:

SELECT
  product_name,
  sales_year,
  SUM(sales_amount) AS total_sales,
  GROUPING(product_name) AS grouping_product,
  GROUPING(sales_year) AS grouping_year
FROM sales
GROUP BY product_name, sales_year WITH ROLLUP;

Kết quả sẽ như sau:

product_name sales_year total_sales grouping_product grouping_year
Product A 2021 1500.00 0 0
Product A 2022 2000.00 0 0
Product A NULL 3500.00 0 1
Product B 2021 1000.00 0 0
Product B 2022 2500.00 0 0
Product B NULL 3500.00 0 1
NULL NULL 7000.00 1 1

Trong kết quả trên:

  • Những dòng có grouping_productgrouping_year là 0 là kết quả của nhóm dữ liệu gốc.
  • Những dòng có grouping_year là 1 nhưng grouping_product là 0 đại diện cho các tổng số phụ dựa trên sản phẩm.
  • Dòng có cả grouping_productgrouping_year đều là 1 chính là tổng số lớn của toàn bộ dữ liệu.

Kết luận

Hàm GROUPING() trong MySQL là một công cụ mạnh mẽ hỗ trợ việc nhóm dữ liệu và phân tích các tập hợp con trong tập dữ liệu lớn. Bằng cách kết hợp với ROLLUP và GROUP BY, chúng ta có thể dễ dàng tạo ra các báo cáo tổng hợp, được chia nhỏ theo nhiều cấp độ khác nhau để có cái nhìn toàn diện hơn về dữ liệu. Qua ví dụ trên, hy vọng rằng việc sử dụng hàm GROUPING() trong công việc thực tế của bạn sẽ trở nên dễ dàng và hiệu quả hơn.

Comments