GROUP BY trong SQL Server

GROUP BY trong SQL Server

Ở trong những phần trước, bạn đã được học về cách sử dụng các mệnh đề join trong SQL Server để truy vấn dữ liệu từ hai hoặc nhiều bảng.

Trong hướng dẫn này, bạn sẽ tìm hiểu cách sử dụng mệnh đề GROUP BY trong SQL Server để sắp xếp các bản ghi theo nhóm theo một hoặc nhiều cột.

Giới thiệu về mệnh đề GROUP BY trong SQL Server

Mệnh đề GROUP BY trong SQL Server cho phép bạn sắp xếp các bản ghi của một truy vấn theo nhóm. Các nhóm được xác định bởi các cột mà bạn chỉ định trong mệnh đề GROUP BY.

Sau đây minh họa cú pháp mệnh đề GROUP BY trong SQL Server:

SELECT
    select_list
FROM
    table_name
GROUP BY
    column_name1,
    column_name2 ,...;

Trong truy vấn này, mệnh đề GROUP BY đã tạo ra một nhóm cho mỗi kết hợp các giá trị trong các cột được liệt kê trong mệnh đề GROUP BY.

Hãy xem ví dụ sau:

SELECT
    customer_id,
    YEAR (order_date) order_year
FROM
    sales.orders
WHERE
    customer_id IN (1, 2)
ORDER BY
    customer_id;

Đây là kết quả:

GROUP BY trong SQL Server

Trong ví dụ này, chúng tôi đã truy xuất thông tin id khách hàng và năm đặt hàng của những khách hàng có id 1 và 2.

Như bạn có thể thấy ở kết quả đầu ra, khách hàng có id 1 đã đặt một đơn hàng vào năm 2016 và hai đơn hàng vào năm 2018. Khách hàng có id hai đã đặt hai đơn hàng vào năm 2017 và một đơn hàng vào năm 2018.

Hãy thêm mệnh đề GROUP BY vào truy vấn trên và xem kết quả:

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;

Đây là kết quả:

GROUP BY trong SQL Server

Mệnh đề GROUP BY đã sắp xếp ba bản ghi đầu tiên của khách hàng có id là 1 thành hai nhóm và ba bản ghi tiếp theo của khách hàng có id là 2 vào hai nhóm khác với sự kết hợp duy nhất của id khách hàng và năm đặt hàng.

Về mặt chức năng, mệnh đề GROUP BY trong truy vấn trên tạo ra kết quả tương tự như truy vấn sau sử dụng mệnh đề DISTINCT:

SELECT DISTINCT
    customer_id,
    YEAR (order_date) order_year
FROM
    sales.orders
WHERE
    customer_id IN (1, 2)
ORDER BY
    customer_id;

Đây là kết quả:

GROUP BY trong SQL Server

Mệnh đề GROUP BY và hàm tập hợp của SQL Server

Trong thực tế, mệnh đề GROUP BY thường được sử dụng với các hàm tập hợp để tạo báo cáo tóm tắt.

Một hàm tập hợp thực hiện một phép tính vào một nhóm và trả về một giá trị duy nhất cho mỗi nhóm. Ví dụ, hàm COUNT() trả về số lượng bản ghi trong mỗi nhóm. Các hàm tập hợp thường được sử dụng khác là SUM() (tính tổng), AVG() (tính trung bình), MIN()(nhỏ nhất), MAX()(lớn nhất).

Mệnh đề GROUP BY sắp xếp các bản ghi thành các nhóm và thực hiện các hàm tập hợp (count, min, max, avg, sum, vv) cho mỗi nhóm.

Ví dụ: truy vấn sau đây trả về số lượng đơn đặt hàng của khách hàng theo năm:

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; 

Đây là kết quả:

Mệnh đề GROUP BY và hàm tập hợp của SQL Server

Nếu bạn muốn thêm bất kỳ cột hoặc biểu thức nào không được liệt kê trong mệnh đề GROUP BY, bạn phải sử dụng cột đó làm đầu vào của hàm tập hợp.

Nếu không, bạn sẽ gặp lỗi vì không có gì đảm bảo rằng cột hoặc biểu thức đó sẽ trả về một giá trị duy nhất cho mỗi nhóm.

Ví dụ: truy vấn sau sẽ thất bại:

SELECT
    customer_id,
    YEAR (order_date) order_year,
    order_status
FROM
    sales.orders
WHERE
    customer_id IN (1, 2)
GROUP BY
    customer_id,
    YEAR (order_date)
ORDER BY
    customer_id;

Ví dụ về mệnh đề GROUP BY trong SQL Server

Chúng ta hãy lấy thêm một số ví dụ để hiểu cách hoạt động của mệnh đề GROUP BY.

Sử dụng mệnh đề GROUP BY với hàm COUNT() trong SQL Server

Truy vấn sau đây trả về số lượng khách hàng ở mỗi thành phố:

SELECT
    city,
    COUNT (customer_id) customer_count
FROM
    sales.customers
GROUP BY
    city
ORDER BY
    city;

Đây là kết quả:

Sử dụng mệnh đề GROUP BY với hàm COUNT() trong SQL Server

Trong ví dụ này, mệnh đề GROUP BY nhóm các khách hàng lại với nhau theo từng thành phố và hàm COUNT() trả về số lượng khách hàng ở mỗi thành phố.

Tương tự, truy vấn sau đây trả về số lượng khách hàng theo tiểu bang và thành phố.

SELECT
    city,
    state,
    COUNT (customer_id) customer_count
FROM
    sales.customers
GROUP BY
    state,
    city
ORDER BY
    city,
    state;

Đây là kết quả:

Sử dụng mệnh đề GROUP BY với hàm COUNT() trong SQL Server

Sử dụng mệnh đề GROUP BY với hàm MIN() và MAX() trong SQL Server

Câu lệnh sau đây trả về giá niêm yết tối thiểu và tối đa của tất cả các sản phẩm với mẫu năm 2018 theo từng nhãn 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;

Đây là kết quả:

Sử dụng mệnh đề GROUP BY với hàm MIN() và MAX() trong SQL Server

Trong ví dụ này, WHEREmệnh đề được xử lý trước GROUP BYmệnh đề, như mọi khi.

Sử dụng mệnh đề GROUP BY với hàm AVG() trong SQL Server

Câu lệnh sau đây sử dụng hàm AVG() trả về giá niêm yết trung bình theo nhãn hiệu cho tất cả các sản phẩm có mẫu năm 2018:

SELECT
    brand_name,
    AVG (list_price) avg_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;

Đây là kết quả:

Sử dụng mệnh đề GROUP BY với hàm AVG() trong SQL Server

Sử dụng mệnh đề GROUP BY với hàm SUM() trong SQL Server

Xem bảng order_items sau :

Sử dụng mệnh đề GROUP BY với hàm SUM() trong SQL Server

Truy vấn sau đây sử dụng hàm SUM() để lấy thành tiền của mỗi đơn hàng:

SELECT
    order_id,
    SUM (
        quantity * list_price * (1 - discount)
    ) net_value
FROM
    sales.order_items
GROUP BY
    order_id;

Đây là kết quả:

Sử dụng mệnh đề GROUP BY với hàm SUM() trong SQL Server

Trong hướng dẫn này, bạn đã học cách sử dụng mệnh đề GROUP BY trong SQL Server để sắp xếp các bản ghi theo nhóm theo một hoặc nhiều cột được chỉ định.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *