Mệnh đề GROUP BY trong SQL Server
Group by trong SQL là gì? Cách dùng Group by khi lập trình bằng SQL như thế nào? Hãy cùng Quantrimang.com tìm hiểu nhé!
Mệnh đề GROUP BY SQL được dùng cùng với câu lệnh SELECT để sắp xếp dữ liệu giống nhau theo nhóm. Mệnh đề GROUP BY theo sau mệnh đề WHERE trong lệnh SELECT và đứng trước mệnh đề ORDER BY hoặc HAVING (nếu chúng tồn tại). Nó thường được dùng với các hàm tổng hợp như SUM, COUNT, AVG, MAX hoặc MIN. Điều này cho phép bạn thực hiện các phép tính trên dữ liệu được nhóm.
Ví dụ, giả sử bạn có một bảng dữ liệu bán hàng bao gồm ngày tháng, sảnh phẩm và số lượng bán được. Để tính tổng doanh thu của tổ chức trong một năm, mệnh đề GROUP By có thể được dùng để nhóm doanh số các sản phẩm lại với nhau. Tương tự, bạn có thể nhóm dữ liệu theo ngày để tính tổng doanh thu từng ngày hoặc kết hợp sản phẩm và ngày tháng để tính tổng doanh thu của từng sản phẩm mỗi ngày.
Công thức
Đây là công thức cơ bản của một mệnh đề GROUP BY:
SELECT column_name(s)
FROM table_name
GROUP BY column_name(s);
column_name(s) tham chiếu tới tên của một hoặc nhiều cột trong bảng mà bạn muốn nhóm dữ liệu và table_name tham chiếu tới tên của bảng mà bạn muốn truy xuất dữ liệu.
Để các bạn dễ theo dõi cách sử dụng GROUP BY trong SQL Server và tiện làm ví dụ, chúng ta sẽ sử dụng bảng dữ liệu dưới đây trong toàn bộ bài viết.
Bảng có tên Quantrimang.com, có 4 cột là IDChuyenmuc, Muccon, Chuyenmuclon, Sobai và 6 hàng như sau:
+------------+----------+-------------+-------+
|IDChuyenmuc | Muccon |Chuyenmuclon | Sobai |
+------------+----------+-------------+-------+
| 1 |SQL Server|Lap trinh | 101 |
| 2 |Facebook |Mang xa hoi | 152 |
| 3 |Python |Lap trinh | 101 |
| 4 |JavaScript|Lap trinh | 122 |
| 5 |Chrome |Web | 94 |
| 6 |Instagram |Mang xa hoi | 165 |
+------------+----------+-------------+-------+
GROUP BY trong SQL Server
Cú pháp mệnh đề GROUP BY trong SQL Server
SELECT
bieu_thuc1, bieu_thuc2,... bieu_thuc_n,
ham_tong_hop (bieu_thuc)
FROM
ten_bang
[WHERE dieukien]
GROUP BY
bieu_thuc1,
bieu_thuc2,...;
Tên biến hoặc giá trị biến:
- bieu_thuc1, bieu_thuc2,... bieu_thuc_n: Biểu thức không nằm bên trong hàm tổng hợp và phải nằm trong mệnh đề GROUP BY.
- ham_tong_hop: Có thể là các hàm như SUM, COUNT, MIN, MAX hoặc AVG.
- ten_bang: Bảng cần lấy bản ghi từ đó, phải có ít nhất 1 bảng trong mệnh đề FROM.
- WHERE dieukien: Tùy chọn. Đây là điều kiện mà bản ghi phải đáp ứng để được chọn.
Ví dụ - dùng hàm SUM
SELECT Chuyenmuclon, SUM(Sobai) AS "Tong"
FROM [Quantrimang.com]
GROUP BY Chuyenmuclon;
Ví dụ này dùng hàm tính tổng SUM để trả về tên Chuyenmuclon và tổng số bài viết (Sobai) (theo tên chuyên mục lớn).
Vì bạn đưa ra 1 cột (Chuyenmuclon) trong lệnh SELECT và không nằm trong hàm SUM nên sẽ phải dùng mệnh đề GROUP BY.
Khi đó ta có bảng kết quả trả về như sau:
+--------------+------+
| Chuyenmuclon | Tong |
+--------------+------+
|Lap trinh | 324 |
|Mang xa hoi | 317 |
|Web | 94 |
+--------------+------+
Ví dụ - dùng hàm COUNT
SELECT COUNT(Chuyenmuclon), Chuyenmuclon
FROM [Quantrimang.com]
WHERE Chuyenmuclon = 'Lap trinh'
GROUP BY Chuyenmuclon;
Ở ví dụ này, hàm COUNT sẽ trả về số lượng Chuyenmuccon của Chuyenmuclon Lap trinh:
+------+--------------+
| | Chuyenmuclon |
+------+--------------+
| 3 | Lap trinh |
+------+--------------+
Nếu không muốn lấy tên cột mà chỉ cần trả về số lượng mục con, bạn chạy lệnh sau:
SELECT COUNT(Chuyenmuclon)
FROM [Quantrimang.com]
WHERE Chuyenmuclon = 'Lap trinh'
GROUP BY Chuyenmuclon;
Kết quả trả về sẽ chỉ có số 3.
Ví dụ - dùng hàm MIN
SELECT Chuyenmuclon, MIN(Sobai) AS 'So luong it nhat'
FROM [Quantrimang.com]
GROUP BY Chuyenmuclon;
Mệnh đề GROUP BY dùng với hàm MIN ở trên sẽ trả về Chuyenmuclon và số lượng bài ít nhất của mục lớn đó.
Ví dụ - dùng hàm MAX
SELECT Chuyenmuclon, MAX(Sobai) AS 'So bai cao nhat'
FROM [Quantrimang.com]
GROUP BY Chuyenmuclon;
Ví dụ cuối cùng này trả về tên của Chuyenmuclon và số bài cao nhất của chuyên mục.
Ví dụ - Dùng với mệnh đề HAVING
Nếu đang băn khoăn tự hỏi làm thế nào lọc kết quả sau khi nhóm, mệnh đề HAVING sẽ giúp bạn giải quyết vấn đề này.
SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
GROUP BY artist_id
HAVING albums > 1;
Lưu ý, mệnh đề HAVING theo sau GROUP BY. Mặt khác, về cơ bản, đó là sự thay thế đơn giản cho WHERE với HAVING. Kết quả:
+------------+--------+
| name | albums |
+------------+--------+
| Pink Floyd | 2 |
| Adele | 2 |
+------------+--------+
Bạn vẫn có thể dùng điều kiện WHERE để lọc kết quả trước khi nhóm. Nó sẽ hoạt động cùng với mệnh đề HAVING để lọc sau khi nhóm:
SELECT r.name, COUNT(*) AS albums
FROM albums l, artists r
WHERE artist_id=r.id
AND release_year > 1990
GROUP BY artist_id
HAVING albums > 1;
Kết quả: Chỉ một nghệ sĩ trong cơ sở dữ liệu đã phát hành nhiều hơn 1 album sau năm 1990.
+-------+--------+
| name | albums |
+-------+--------+
| Adele | 2 |
+-------+--------+
Bài trước: Điều kiện EXISTS trong SQL Server
Bài sau: Mệnh đề HAVING trong SQL Server

Bạn nên đọc
