Thực Chiến Dự Án Phân Tích Dữ Liệu Bán Hàng & Tổng Kết Chuỗi Bài Học

7fe62de5-3227-4228-80ec-e77f754dd82e

Chúc mừng bạn đã đồng hành cùng MCNA Technology School  – bài học cuối cùng trong chuỗi series SQL Nâng Cao!

Sau khi đã nắm vững các kỹ thuật nền tảng từ Window Functions, Transaction, Trigger, Index, View cho đến User-Defined Functions (UDF), đây là lúc bạn xâu chuỗi tất cả kiến thức để giải quyết một bài toán thực tế của doanh nghiệp.

1. Bài Toán Thực Tế: Hệ Thống Bán Hàng E-Commerce

Giả sử bạn là Data Analyst  tại một công ty Thương mại điện tử. Bạn được giao nhiệm vụ thiết kế và tối ưu hệ thống xử lý đơn hàng với 3 bảng dữ liệu chính:

  • KhachHang (MaKH, TenKH, ThanhPho)

  • DonHang (MaDH, MaKH, NgayDat, TongTien, TrangThai)

  • ChiTietDonHang (MaCT, MaDH, MaSP, SoLuong, DonGia)

2. Triển Khai Giải Pháp SQL Nâng Cao

Bước 1: Tạo View Tổng Hợp Doanh Thu Che Giấu Thông Tin Nhạy Cảm

Tạo một VIEW giúp bộ phận Báo cáo khai thác doanh thu thực tế của các đơn hàng thành công (TrangThai = 'Completed') mà không truy cập trực tiếp bảng gốc.

SQL

CREATE VIEW vw_DoanhThuThanhCong AS
SELECT 
    dh.MaDH,
    dh.MaKH,
    dh.NgayDat,
    dh.TongTien
FROM DonHang dh
WHERE dh.TrangThai = 'Completed';

Bước 2: Dùng Window Functions Phân Tích Thứ Hạng Chi Tiêu Khách Hàng

Sử dụng hàm DENSE_RANK() để xếp hạng mức độ chi tiêu của khách hàng theo từng thành phố.

SQL

SELECT 
    kh.ThanhPho,
    kh.TenKH,
    SUM(v.TongTien) AS TongChiTieu,
    DENSE_RANK() OVER (
        PARTITION BY kh.ThanhPho 
        ORDER BY SUM(v.TongTien) DESC
    ) AS HangChiTieu
FROM vw_DoanhThuThanhCong v
JOIN KhachHang kh ON v.MaKH = kh.MaKH
GROUP BY kh.ThanhPho, kh.TenKH;

Bước 3: Đảm Bảo An Toàn Giao Dịch Với Transaction & Exception Handling

Viết thủ tục hủy đơn hàng: Nếu đơn hàng chưa giao, chuyển trạng thái sang 'Cancelled' và hoàn trả lại số lượng tồn kho cho sản phẩm. Tất cả phải nằm trong một Transaction.

SQL

BEGIN TRANSACTION;

BEGIN TRY
    -- 1. Cập nhật trạng thái đơn hàng
    UPDATE DonHang
    SET TrangThai = 'Cancelled'
    WHERE MaDH = 1005 AND TrangThai = 'Pending';

    -- Check nếu không có dòng nào bị ảnh hưởng (Đơn hàng không tồn tại hoặc đã giao)
    IF @@ROWCOUNT = 0
    BEGIN
        RAISERROR(N'Đơn hàng không hợp lệ hoặc đã được xử lý!', 16, 1);
    END

    -- 2. Hoàn trả số lượng kho (Giả định có bảng SanPham)
    UPDATE sp
    SET sp.SoLuongKho = sp.SoLuongKho + ct.SoLuong
    FROM SanPham sp
    JOIN ChiTietDonHang ct ON sp.MaSP = ct.MaSP
    WHERE ct.MaDH = 1005;

    COMMIT TRANSACTION;
    PRINT N'Hủy đơn hàng và hoàn kho thành công!';
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
    PRINT N'Lỗi xử lý: ' + ERROR_MESSAGE();
END CATCH;

Bước 4: Tăng Tốc Truy Vấn Bằng Composite Index

Tạo Index kết hợp để tối ưu tốc độ tìm kiếm đơn hàng theo khách hàng và ngày đặt.

SQL

CREATE NONCLUSTERED INDEX idx_DonHang_KhachHang_Ngay
ON DonHang(MaKH, NgayDat)
INCLUDE (TongTien, TrangThai);

🏆 CHINH PHỤC CÁC DỰ ÁN DỮ LIỆU CẤP DOANH NGHIỆP

Việc kết hợp thuần thục các kỹ thuật SQL nâng cao không chỉ giúp bạn viết code chạy đúng, mà còn giúp hệ thống vận hành ổn định khi quy mô dữ liệu tăng lên hàng triệu dòng.

🚀 Đăng ký Khóa học SQL Nâng Cao & System Architecture tại MCNA Technology School để:

  • Trực tiếp thực hành trên các bộ dữ liệu lớn (Big Data) chuẩn thực tế.

  • Xây dựng Portfolio cá nhân ấn tượng để ứng tuyển các vị trí Data Analyst, Data Engineer, Backend Developer.

  • Nhận chứng chỉ hoàn thành khóa học được công nhận bởi các đối tác công nghệ của MCNA.

👉 [ĐĂNG KÝ NHẬN TƯ VẤN ] (link đăng ký)

Tác giả: Huỳnh Trung Hậu

📞 Hotline: 0939.866.825 (Mr. Minh Khang)
🌐 Website: MCNA Technology School
📍 Hà Nội: 30 Trung Liệt, Đống Đa | Liền kề 44B TT2 Văn Quán, Hà Đông
📍 TP.HCM: 50B Phan Tây Hồ, Cầu Kiệu

Chỉ mục