Lệnh Group By trong SQL Server – Freetuts
Trong bài này chúng ta sẽ tìm hiểu lệnh Group By trong SQL Server, đây là lệnh gop nhóm giúp bạn gom dữ liệu dựa theo một field nào đó.
Bài viết này được đăng tại
freetuts.net
, không được copy dưới mọi hình thức.
Group By rất quan trọng trong các câu lệnh liên quan đến thống kê và tính toán, vì vậy bạn cần nắm vững nó không chỉ ở SQL Server mà ở hầu hết các hệ quản trị CSDL hiện nay.
1. Cú pháp Group By trong SQL Server
Nếu bạn đã học series T-SQL thì chắc chắn đã được mình giới thiệu qua về group by rồi. Nếu bạn chưa xem thì hãy quay lại đọc các bài viết ở đó trước nhé.
Gop nhóm hay còn gọi là gom tất cả những dòng trùng nhau thành 1 nhóm đứng cạnh nhau. Tiêu chí để biết trùng nhau hay không sẽ phục thuộc vào danh sách các field mà ta truyền vào ở lệnh Group By.
Bài viết này được đăng tại [free tuts .net]
Cú pháp của Group By trong SQL Server như sau:
SELECT select_list FROM table_name GROUP BY column_name1, column_name2 ,...;
Trong đó bạn cần lưu ý rằng:
select_list
là danh sách các field muốn lấy, trong đó phải chứa những field mà bạn truyền ở group bytable_name
là tên table bạn muốn truy vấn. Có thể một hoặc nhiều table, thậm chí JOIN và Subquery vẫn được.column_name1
,column_name2
, .. là danh sách các field sẽ group by.
Ví dụ: Lấy danh sách customer_id và năm đặt hàng của hai khách hàng có id là 1 và 2.
SELECT customer_id, YEAR (order_date) order_year FROM sales.orders WHERE customer_id IN (1, 2) ORDER BY customer_id;
Kết quả:
Như kết quả bạn thấy là sẽ gom thành hai nhóm như sau:
- Khách hàng ID 1 đặt 1 đơn vào năm 2016 và 2 đơn năm 2018
- Khách hàng ID 2 đặt 2 đơn 2017 và 1 đơn 2018
Bỏ qua tiêu chí xem tổng số đơn, bây giờ mình muốn lấy những năm mà khách hàng có ID 1 và 2 đã đặt hàng.
Với câu hỏi này thì ta phải gom nhóm thêm field order_year
nữa, lúc này nó sẽ bỏ đi những dòng trùng nhau.
SELECT customer_id, YEAR (order_date) order_year FROM sales.orders WHERE customer_id IN (1, 2) GROUP BY customer_id, YEAR (order_date) ORDER BY customer_id;
Về mặt chức năng thì ở câu hỏi này ta có thể thay thế bằng lệnh DISTINCT
.
SELECT DISTINCT customer_id, YEAR (order_date) order_year FROM sales.orders WHERE customer_id IN (1, 2) ORDER BY customer_id;
2. Group By kết hợp các Function trong SQL Server
Group By trong SQL Server có thể kết hợp với các function như: SUM
, AVG
, MIN
, MAX
để thống kê dữ liệu.
Quay lại bài toán ở trên, bây giờ mình muốn lấy thông tin ID khách hàng, năm mà khách hàng đã đặt và tổng số đơn mà khách đã đặt theo từng năm.
Với yêu cầu này ta sẽ viết lại câu SQL như sau:
SELECT customer_id, YEAR (order_date) order_year, COUNT (order_id) order_placed FROM sales.orders WHERE customer_id IN (1, 2) GROUP BY customer_id, YEAR (order_date) ORDER BY customer_id;
Hàm COUNT là hàm tính tổng số lượng record, nó sẽ tính tổng số record trong nhóm và trả về một số nguyên.
Đây là một ví dụ đơn giản thôi nhé.
3. Các ví dụ khác về Group By trong SQL Server
Hãy thực hành thêm vài ví dụ nữa, mình tin là bạn sẻ hiểu ra vấn đề.
Ví dụ 1: Lấy thông tin thành phố và tổng số khách hàng đang sống ở thành phố đó.
SELECT city, COUNT (customer_id) customer_count FROM sales.customers GROUP BY city ORDER BY city;
Ví dụ 2: Lấy thông tin gồm tên thành phố / tên state / tổng số khách hàng sống tai thành phố và state đó.
SELECT city, state, COUNT (customer_id) customer_count FROM sales.customers GROUP BY state, city ORDER BY city, state;
Ví dụ 3: Lấy giá nhỏ nhất và cao nhất các sản phẩm sản xuất năm 2018 của từng thương hiệu.
SELECT brand_name, MIN (list_price) min_price, MAX (list_price) max_price FROM production.products p INNER JOIN production.brands b ON b.brand_id = p.brand_id WHERE model_year = 2018 GROUP BY brand_name ORDER BY brand_name;
Trên là một vài kiến thức cơ bản của lệnh Group By trong SQL Server. Đây là lệnh gom nhóm khá quan trọng, nhất là những bạn DBA phải xuất báo cáo thường xuyên cho sếp. Chúc bạn thực hiện thành công nhé.