Câu lệnh GROUP BY trong SQL | Định nghĩa, cách sử dụng

Nội dung được viết bởi G-LEARNING

Khi tiến hành truy vấn hay tính toán trên SQL, sẽ có những lúc chúng ta muốn nhóm các hàng trong một tập kết quả dựa trên một cột hoặc nhiều cột. Lúc này, chúng ta sẽ sử dụng câu lệnh GROUP BY trong SQL

Vậy định nghĩa, cách dùng và ứng dụng của GROUP BY trong thực tế như thế nào? Cùng Gitiho tìm hiểu trong bài viết ngày hôm nay nhé!

Mệnh đề GROUP BY trong SQL là gì?

Mệnh đề GROUP BY là một lệnh SQL được sử dụng để nhóm các hàng có cùng một bản ghi thuộc một trường nhất định nào đó. 

GROUP BY là mệnh đề tùy chọn và thường được sử dụng cùng với các hàm tổng hợp với mục đích tạo các báo cáo tóm tắt từ cơ sở dữ liệu như hàm MAX, MIN, hàm SUM, AVG, COUNT trong SQL. Nó thường được sử dụng với câu lệnSELECT trong SQL.

Các câu truy vấn có chứa mệnh đề GROUP BY được gọi là các truy vấn nhóm và chỉ trả về một hàng cho mỗi mục được nhóm.

Cú pháp GROUP BY trong SQL:

SELECT column1, column2,...
FROM table_name
WHERE condition
GROUP BY column1, column2,...
HAVING condition
ORDER BY column1, column2,...

Trong đó:

  • SELECT column1, column2: Chọn các cột bạn muốn hiển thị trong bảng dữ liệu.
  • FROM table_name: Chỉ định bảng mà bạn muốn truy vấn dữ liệu trong database.
  • WHERE condition: Lọc dữ liệu trước khi thực hiện việc nhóm (không bắt buộc).
  • GROUP BY column1, column2: Nhóm các hàng có cùng giá trị trong column1, column2 lại với nhau. Bạn có thể nhóm theo một hoặc nhiều cột.
  • HAVING condition: Áp dụng điều kiện để lọc các nhóm sau khi đã được nhóm lại (không bắt buộc). Khác với WHERE trong SQL, HAVING trong SQL được sử dụng sau khi dữ liệu đã được nhóm để giới hạn kết quả truy vấn.
  • ORDER BY column1, column2: Sắp xếp kết quả truy vấn theo các cột đã chỉ định (không bắt buộc).

Ví dụ về mệnh đề GROUP BY trong SQL

Mệnh đề GROUP BY với hàm SUM

Yêu cầu 1: Tính tổng doanh thu và chi phí theo từng số đơn hàng của trường SalesOrderNumber. Dữ liệu được lấy từ bảng sales trong database.

Ta có công thức sau:

select SUM(sales), SUM(cost) from sales
GROUP BY SalesOrderNumber

Khi chạy công thức trên, bạn sẽ thu được hơn 900 bản ghi trong 2 cột. Một cột là tổng doanh thu, một cột là tổng chi phí theo Số đơn đặt hàng. 

Mệnh đề GROUP BY với hàm SUM 1

Tuy nhiên, khi nhìn vào kết quả thì chúng ta khó có thể phân biệt đâu là cột doanh thu, đâu là cột chi phí. Đó, bạn sẽ đặt tên cho cột ở phần công thức như sau:

select SUM(sales) as total_sales, SUM(cost) as total_costs from sales
GROUP BY SalesOrderNumber

Khi chạy công thức, chúng ta đã có 2 cột tương ứng với tổng doanh thu và tổng chi phí theo từng SalesOrderNumber. 

Mệnh đề GROUP BY với hàm SUM 2

Trong trường hợp, bạn muốn nhìn thấy chi tiết từng SalesOrderNumber có tổng doanh thu và chi phí như nào thì chúng ta sẽ thêm trường SalesOrderNumber vào câu lệnh Select như sau:

select SalesOrderNumber, SUM(sales) as total_sales, SUM(cost) as total_costs from sales
GROUP BY SalesOrderNumber

Bây giờ kết quả đã hiển thị rõ từng SalesOrderNumber để bạn tiện theo dõi và phân tích số liệu như sau:

Mệnh đề GROUP BY với hàm SUM 3

Yêu cầu 2: Tính tổng doanh thu và chi phí theo từng Customer_ID (theo tên là total_sales và total_costs). Sau đó sắp xếp cột Customer_ID theo thứ tự giảm dần.

Với yêu cầu này, chúng ta sẽ sử dụng kết hợp toán tử ORDER BY trong SQL để sắp xếp dữ liệu như mong muốn. Công thức như sau:

select CustomerID, SUM(sales) as total_sales, SUM(cost) as total_costs from sales
GROUP BY CustomerID
ORDER BY CustomerID DESC

Cho chạy công thức, chúng ta sẽ nhận được kết quả hơn 1000 bản ghi chứa Customer_ID tương ứng với tổng doanh thu và chi phí bên cạnh.

Mệnh đề GROUP BY với hàm SUM 4

Yêu cầu 3: Tính tổng doanh thu và chi phí theo từng tháng (month) và sắp xếp theo thứ tự tăng dần.

Chúng ta sẽ thực hiện nhóm và tính toán theo từng tháng trước:

select Month, SUM(sales) as total_sales, SUM(cost) as total_costs from sales
GROUP BY Month
ORDER BY Month ASC

Chạy công thức, chúng ta sẽ thấy được tổng doanh thu và chi phí theo từng tháng như sau:

Mệnh đề GROUP BY với hàm SUM 5

Mệnh đề GROUP BY với hàm COUNT

Yêu cầu 4: Đếm tất cả khách hàng theo từng Geographykey trong bảng dữ liệu Customer_Info.

select Geographykey, count(CustomerID) as number_of_customers from Customer_Info
GROUP BY Geographykey

Cho chạy công thức, chúng ta sẽ thấy được tổng số khách hàng theo từng khu vực địa lý (Geographykey) như sau:

Mệnh đề GROUP BY với hàm COUNT

Để hiểu rõ hơn về GROUP BY và những cú pháp, câu lệnh hay hàm khác trong SQL, bạn hãy nhanh tay đăng ký khóa học SQL sau của Gitiho:

Mệnh đề GROUP BY với hàm AVG

Yêu cầu 5: Tính trung bình số trẻ em, số ô tô sở hữu và thu nhập hàng năm của từng trường Geographykey trong bảng Customer_Info.

Bạn viết công thức sau:

select Geographykey, AVG(TotalChildren) as avg_of_children, AVG(NumberCarsOwned) as avg_of_cars, AVG(YearlyIncome) as avg_of_income from Customer_Info
GROUP BY Geographykey
ORDER BY Geographykey

Chạy công thức này, bạn sẽ tính được trung bình số trẻ em, ô tô sở hữu, và thu nhập hàng năm theo từng vùng địa lý.

Mệnh đề GROUP BY với hàm AVG 1

Yêu cầu 6: Hiển thị Tên thành phố trong bảng dữ liệu Geographic, tên Geographykey và thu nhập bình quân hàng năm của từng Geographykey trong bảng dữ liệu Customer_info.

Vì tên thành phố City và thu nhập bình quân năm theo từng Geographykey không thuộc cùng một bảng dữ liệu. Do đó, chúng ta cần phải tham chiếu các Geographykey tương ứng với từng tên thành phố City trong bảng Geographic. Để làm được, chúng ta sẽ sử dụng kết hợp câu lệnh LEFT JOIN trong SQL.

With avg_income as (select Geographykey, AVG(YearlyIncome) as avg_of_income from Customer_Info
GROUP BY Geographykey)
select Geographic.City, avg_income.GeographyKey, avg_income.avg_of_income FROM avg_income
LEFT JOIN Geographic
ON avg_income.GeographyKey=Geographic.GeographyKey

Trong đó:

  • WITH avg_income AS ...: là câu lệnh để tạo một bảng tạm (CTE) tên là avg_income chứa kết quả của một truy vấn (thu nhập trung bình của từng Geographykey)..
  • select Geographic.City, avg_income.GeographyKey, avg_income.avg_of_income FROM avg_income: câu lệnh gọi trường dữ liệu City từ bảng Geographic, GeographyKey từ bảng tạm avg_income và avg_of_income từ avg_income.
  • LEFT JOIN Geographic ON avg_income.GeographyKey = Geographic.GeographyKey: Kết hợp bảng tạm avg_income với bảng Geographic để lấy thông tin chi tiết về vùng, ngay cả khi không có kết quả khớp trong Geographic.

Chạy công thức chúng ta sẽ thu được các bản ghi như mong muốn:

Mệnh đề GROUP BY với hàm AVG 2

Kết luận

Qua hướng dẫn trên, chúng ta đã biết mệnh đề GROUP BY trong SQL được sử dụng để nhóm các hàng có cùng một giá trị. Cùng Gitiho thực hành thêm để hiểu rõ hơn về cách sử dụng câu lệnh này trong thực tế nha. Chúc bạn thành công!

Xem thêm:

Hướng dẫn câu lệnh UPDATE trong MySQL và các ví dụ

Khóa học giúp bạn làm chủ ngôn ngữ truy vấn dữ liệu phổ biến SQL từ cơ bản đến nâng cao. Từ đó có thể tự tin xây dựng, truy vấn, và tối ưu hóa các cơ sở dữ liệu phức tạp, hỗ trợ phân tích, làm báo cáo và ra quyết định kinh doanh một cách hiệu quả.

Đăng ký học thử để trải nghiệm ngay hôm nay!

/5 - ( bình chọn)

/5 - ( bình chọn)

0 thảo luận

@ 2020 - Bản quyền của Công ty cổ phần công nghệ giáo dục Gitiho Việt Nam
Giấy chứng nhận Đăng ký doanh nghiệp số: 0109077145, cấp bởi Sở kế hoạch và đầu tư TP. Hà Nội
Giấy phép mạng xã hội số: 588, cấp bởi Bộ thông tin và truyền thông