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

