06/04/2021, 14:50

Lệnh Group By trong SQL Server - SQL Server căn bản

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 đó. 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ị ...

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 đó.

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.

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 by
  • table_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ả:

SQL Server GROUP BY clause png

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;

SQL Server GROUP BY clause example png

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;

SQL Server GROUP BY clause example png

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.

SQL Server GROUP BY clause expression example png

Đâ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;

SQL Server GROUP BY COUNT example png

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;

SQL Server GROUP BY clause multiple columns example png

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;

SQL Server GROUP BY MIN and MAX example png

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é.

Hoàng Hải Đăng

24 chủ đề

7226 bài viết

Cùng chủ đề
0