# SQL FOR BUSINESS ANALYST: CẨM NANG TRUY VẤN DỮ LIỆU THỰC CHIẾN
> Biên soạn bởi: Lê Vũ Hoàng (Business Analyst)
> Mục tiêu: Tổng hợp các câu lệnh SQL thực tế từ cơ bản đến nâng cao để hỗ trợ BA khai phá dữ liệu (Data Exploration) và tự xây dựng báo cáo phân tích hiệu quả.

---

## 1. NHÓM TRUY VẤN CƠ BẢN & LỌC DỮ LIỆU
Truy xuất danh sách khách hàng hoạt động tích cực tại khu vực Hà Nội đăng ký tài khoản trong năm 2026:
```sql
SELECT customer_id, full_name, email, created_at
FROM customers
WHERE province = 'Hà Nội' 
  AND status = 'active'
  AND created_at >= '2026-01-01'
ORDER BY created_at DESC
LIMIT 100;
```

---

## 2. NHÓM TRUY VẤN GHÉP BẢNG (JOIN)
Kết nối 3 bảng dữ liệu: Đơn hàng (Orders), Chi tiết đơn hàng (Order_Details) và Khách hàng (Customers) để phân tích hành vi mua sắm:
```sql
SELECT 
  c.customer_id,
  c.full_name,
  o.order_id,
  o.order_date,
  d.product_name,
  d.quantity,
  d.unit_price,
  (d.quantity * d.unit_price) AS total_item_amount
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
INNER JOIN order_details d ON o.order_id = d.order_id
WHERE o.status = 'completed'
ORDER BY o.order_date DESC;
```

---

## 3. NHÓM TRUY VẤN NHÓM & GỘP DỮ LIỆU (GROUP BY & HAVING)
Thống kê tổng doanh thu bán hàng và số lượng đơn hàng theo từng danh mục sản phẩm, chỉ lấy các danh mục đạt doanh thu từ 50 triệu VNĐ trở lên trong tháng 05/2026:
```sql
SELECT 
  p.category_name,
  COUNT(DISTINCT o.order_id) AS total_orders,
  SUM(d.quantity * d.unit_price) AS total_revenue
FROM orders o
INNER JOIN order_details d ON o.order_id = d.order_id
INNER JOIN products p ON d.product_id = p.product_id
WHERE o.order_date >= '2026-05-01' AND o.order_date < '2026-06-01'
  AND o.status = 'completed'
GROUP BY p.category_name
HAVING SUM(d.quantity * d.unit_price) >= 50000000
ORDER BY total_revenue DESC;
```

---

## 4. BẢNG TẠM THỜI (COMMON TABLE EXPRESSIONS - CTE)
Sử dụng CTE để tối ưu cấu trúc truy vấn phân tích nhóm khách hàng VIP có tổng chi tiêu trên 20 triệu VNĐ:
```sql
WITH customer_spendings AS (
  SELECT 
    customer_id,
    SUM(total_amount) AS total_spent,
    COUNT(order_id) AS number_of_orders
  FROM orders
  WHERE status = 'completed'
  GROUP BY customer_id
)
SELECT 
  c.customer_id,
  c.full_name,
  c.email,
  s.total_spent,
  s.number_of_orders
FROM customers c
INNER JOIN customer_spendings s ON c.customer_id = s.customer_id
WHERE s.total_spent >= 20000000
ORDER BY s.total_spent DESC;
```

---

## 5. CÁC HÀM PHÂN TÍCH NÂNG CAO (WINDOW FUNCTIONS)
Xếp hạng các sản phẩm bán chạy nhất trong từng danh mục dựa trên tổng doanh số bán ra bằng hàm ROW_NUMBER():
```sql
WITH product_sales AS (
  SELECT 
    p.category_name,
    p.product_name,
    SUM(d.quantity) AS total_qty_sold,
    ROW_NUMBER() OVER (
      PARTITION BY p.category_name 
      ORDER BY SUM(d.quantity) DESC
    ) as sales_rank
  FROM order_details d
  INNER JOIN products p ON d.product_id = p.product_id
  GROUP BY p.category_name, p.product_name
)
SELECT category_name, product_name, total_qty_sold, sales_rank
FROM product_sales
WHERE sales_rank <= 3
ORDER BY category_name, sales_rank;
```