Bài 1: Giới thiệu về Trình quản lý quảng cáo

BÀI GIẢNG: CÁC LỆNH TỔNG HỢP DỮ LIỆU TRONG SQL SERVER

1. Giới thiệu

Trong SQL Server, các lệnh tổng hợp dữ liệu giúp chúng ta tính toán các giá trị thống kê từ tập dữ liệu. Các lệnh này thường đi kèm với GROUP BY để nhóm dữ liệu và HAVING để lọc dữ liệu sau khi nhóm.

2. Các hàm tổng hợp trong SQL Server

SQL Server cung cấp các hàm tổng hợp phổ biến như sau:

  • COUNT(): Đếm số lượng bản ghi
  • SUM(): Tính tổng giá trị của một cột
  • AVG(): Tính giá trị trung bình của một cột
  • MIN(): Lấy giá trị nhỏ nhất
  • MAX(): Lấy giá trị lớn nhất

3. Sử dụng GROUP BY để nhóm dữ liệu

GROUP BY dùng để nhóm các bản ghi có cùng một giá trị trong một hoặc nhiều cột. Sau khi nhóm, ta có thể sử dụng các hàm tổng hợp để tính toán trên từng nhóm.

Cú pháp:

SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name;

Ví dụ: Giả sử ta có bảng Orders chứa dữ liệu đơn hàng:

OrderID CustomerID OrderDate TotalAmount
1 A001 2024-01-05 500
2 A002 2024-01-07 700
3 A001 2024-02-10 300
4 A003 2024-02-15 1000
5 A002 2024-03-01 400

Truy vấn để tính tổng số tiền đã chi tiêu của từng khách hàng:

SELECT CustomerID, SUM(TotalAmount) AS TotalSpent
FROM Orders
GROUP BY CustomerID;

Kết quả:

CustomerID TotalSpent
A001 800
A002 1100
A003 1000

4. Sử dụng HAVING để lọc dữ liệu sau khi nhóm

HAVING được dùng để lọc kết quả sau khi đã nhóm dữ liệu, vì lệnh WHERE không thể dùng với các hàm tổng hợp.

Cú pháp:

SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING condition;

Ví dụ:

Lọc những khách hàng có tổng chi tiêu lớn hơn 1000.

SELECT CustomerID, SUM(TotalAmount) AS TotalSpent
FROM Orders
GROUP BY CustomerID
HAVING SUM(TotalAmount) > 1000;

Kết quả:

CustomerID TotalSpent
A002 1100

5. Kết hợp GROUP BY với nhiều cột

Chúng ta có thể nhóm dữ liệu theo nhiều cột để phân tích chi tiết hơn.

Ví dụ:

Tính tổng doanh thu theo từng khách hàng và từng năm.

SELECT CustomerID, YEAR(OrderDate) AS OrderYear, SUM(TotalAmount) AS TotalSpent
FROM Orders
GROUP BY CustomerID, YEAR(OrderDate);

Kết quả:

CustomerID OrderYear TotalSpent
A001 2024 800
A002 2024 1100
A003 2024 1000

6. Lưu ý quan trọng

  • Các cột trong SELECT phải xuất hiện trong GROUP BY hoặc là một hàm tổng hợp.
  • HAVING chỉ dùng để lọc dữ liệu sau khi đã nhóm.
  • WHERE lọc dữ liệu trước khi nhóm, còn HAVING lọc dữ liệu sau khi nhóm.

7. Tổng kết

  • GROUP BY giúp nhóm dữ liệu theo một hoặc nhiều cột.
  • HAVING dùng để lọc kết quả nhóm.
  • Các hàm tổng hợp như COUNT, SUM, AVG, MIN, MAX giúp phân tích dữ liệu hiệu quả.
  • Kết hợp GROUP BY với nhiều cột để có cái nhìn chi tiết hơn về dữ liệu.

Bài tập áp dụng

Bạn có bảng Sales lưu trữ thông tin về các giao dịch bán hàng với cấu trúc sau:

SaleID EmployeeID CustomerID SaleDate TotalAmount
1 E001 C001 2024-01-05 500
2 E002 C002 2024-01-07 700
3 E001 C003 2024-02-10 300
4 E003 C001 2024-02-15 1000
5 E002 C002 2024-03-01 400
6 E001 C004 2024-03-10 600
7 E003 C002 2024-03-15 800
8 E002 C003 2024-04-01 900

 

CREATE TABLE Sales (
    SaleID INT PRIMARY KEY,
    EmployeeID VARCHAR(10),
    CustomerID VARCHAR(10),
    SaleDate DATE,
    TotalAmount DECIMAL(10,2)
);

INSERT INTO Sales (SaleID, EmployeeID, CustomerID, SaleDate, TotalAmount)
VALUES 
    (1, 'E001', 'C001', '2024-01-05', 500),
    (2, 'E002', 'C002', '2024-01-07', 700),
    (3, 'E001', 'C003', '2024-02-10', 300),
    (4, 'E003', 'C001', '2024-02-15', 1000),
    (5, 'E002', 'C002', '2024-03-01', 400),
    (6, 'E001', 'C004', '2024-03-10', 600),
    (7, 'E003', 'C002', '2024-03-15', 800),
    (8, 'E002', 'C003', '2024-04-01', 900);

 

Yêu cầu:

  1. Đếm số lượng giao dịch của từng nhân viên (EmployeeID).
  2. Tính tổng doanh thu (TotalAmount) của mỗi nhân viên.
  3. Tính doanh thu trung bình của mỗi nhân viên.
  4. Lọc ra những nhân viên có tổng doanh thu lớn hơn 1000.
  5. Tính tổng doanh thu theo từng năm của mỗi nhân viên (dựa vào SaleDate).

Gợi ý:

  • Sử dụng GROUP BY để nhóm theo EmployeeID.
  • Dùng các hàm tổng hợp COUNT(), SUM(), AVG().
  • Dùng HAVING để lọc nhân viên có doanh thu lớn hơn 1000.
  • Dùng YEAR(SaleDate) để nhóm theo năm.

Nộp bài: File SQL