Câu lệnh GROUP BY trong SQL

Các hàm tổng hợp (ví dụ SUM) thường cần thêm câu lệnh GROUP BY.

Câu lệnh GROUP BY

Câu lệnh GROUP BY được sử dụng để kết hợp các hàm tổng hợp, phân nhóm kết quả theo một hoặc nhiều cột.

Cú pháp SQL GROUP BY

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name

Mẫu SQL GROUP BY

Chúng ta có bảng "Orders" sau đây:

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

Hiện tại, chúng ta muốn tìm tổng số tiền (tổng số đơn đặt hàng) của mỗi khách hàng.

Chúng ta muốn sử dụng câu lệnh GROUP BY để nhóm theo khách hàng.

Chúng ta sử dụng câu lệnh SQL sau:

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer

Kết quả tập hợp giống như sau:

Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000

Đáng kinh ngạc đúng không?

Hãy cùng xem nếu bỏ qua GROUP BY sẽ xảy ra điều gì:

SELECT Customer,SUM(OrderPrice) FROM Orders

Kết quả tập hợp giống như sau:

Customer SUM(OrderPrice)
Bush 5700
Carter 5700
Bush 5700
Bush 5700
Adams 5700
Carter 5700

Kết quả tập hợp trên không phải là điều chúng ta cần.

Vậy tại sao không thể sử dụng câu lệnh SELECT trên? Giải thích như sau: Câu lệnh SELECT trên chỉ định hai cột (Customer và SUM(OrderPrice)). "SUM(OrderPrice)" trả về một giá trị duy nhất (tổng cộng của cột "OrderPrice"), trong khi "Customer" trả về sáu giá trị (mỗi giá trị tương ứng với mỗi hàng trong bảng "Orders"). Do đó, chúng ta không nhận được kết quả chính xác. Tuy nhiên, bạn đã thấy, câu lệnh GROUP BY đã giải quyết vấn đề này.

GROUP BY nhiều hơn một cột

Chúng ta cũng có thể áp dụng câu lệnh GROUP BY cho nhiều cột hơn, ví dụ như sau:

SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate