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 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ệnh SELECT 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 đó:
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.
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.
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:
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.
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:
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:
Để 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:
SQLG01 - Truy vấn dữ liệu với SQL
Nimbus Academy
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ý.
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 đó:
Chạy công thức chúng ta sẽ thu được các bản ghi như mong muố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:
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!