Day 13 - Pro: Course Project

Bối cảnh: Hệ thống E-commerce (Thương mại điện tử)


1. Project Introduction

  • Mục tiêu dự án: Áp dụng các kiến thức đã học về SQL để phân tích dữ liệu từ hệ thống E-commerce và đưa ra các quyết định kinh doanh thông minh.

  • Các bảng dữ liệu:

    • customers: Thông tin khách hàng (customer_id, customer_name, email, city).

    • products: Thông tin sản phẩm (product_id, product_name, category, price).

    • orders: Thông tin đơn hàng (order_id, customer_id, product_id, quantity, total_amount, order_date, payment_method).

  • Yêu cầu: Sử dụng các kiến thức nâng cao (Window Functions, Grouping Sets, Rollups, Self-Joins, v.v.) để hoàn thành các thử thách trong dự án.


2. The Challenges

  • Thử thách 1: Phân tích doanh thu theo từng danh mục sản phẩm (category) và từng tháng.

  • Thử thách 2: Tìm khách hàng có tổng giá trị đơn hàng cao nhất trong từng thành phố (city).

  • Thử thách 3: Phân tích tỷ lệ đóng góp doanh thu của từng sản phẩm trong tổng doanh thu của danh mục.

  • Thử thách 4: Tính tổng số lượng sản phẩm đã bán theo từng danh mục và từng phương thức thanh toán.

  • Thử thách 5: Tìm các cặp sản phẩm có cùng danh mục và giá tương đương.

  • Thử thách 6: Phân tích doanh thu tích lũy theo từng tháng.

  • Thử thách 7: Tìm khoảng thời gian giữa hai đơn hàng liên tiếp của cùng một khách hàng.


3. Solutions

  • Dưới đây là các giải pháp chi tiết cho từng thử thách:

4. Solution 1: Phân tích doanh thu theo từng danh mục sản phẩm và từng tháng

  • Yêu cầu: Tính tổng doanh thu (total_amount) theo từng danh mục sản phẩm (category) và từng tháng.

  • Giải pháp:

      SELECT p.category, 
             EXTRACT(MONTH FROM o.order_date) AS order_month, 
             SUM(o.total_amount) AS total_revenue
      FROM orders o
      INNER JOIN products p ON o.product_id = p.product_id
      GROUP BY p.category, order_month
      ORDER BY p.category, order_month;
    

5. Solution 2: Tìm khách hàng có tổng giá trị đơn hàng cao nhất trong từng thành phố

  • Yêu cầu: Tìm khách hàng (customer_name) có tổng giá trị đơn hàng (total_amount) cao nhất trong từng thành phố (city).

  • Giải pháp:

      WITH customer_revenue AS (
        SELECT c.customer_name, c.city, SUM(o.total_amount) AS total_spent,
               RANK() OVER (PARTITION BY c.city ORDER BY SUM(o.total_amount) DESC) AS rank
        FROM orders o
        INNER JOIN customers c ON o.customer_id = c.customer_id
        GROUP BY c.customer_name, c.city
      )
      SELECT customer_name, city, total_spent
      FROM customer_revenue
      WHERE rank = 1;
    

6. Solution 3: Phân tích tỷ lệ đóng góp doanh thu của từng sản phẩm trong tổng doanh thu của danh mục

  • Yêu cầu: Tính tỷ lệ phần trăm đóng góp doanh thu của từng sản phẩm trong tổng doanh thu của danh mục.

  • Giải pháp:

      SELECT p.product_name, p.category, 
             SUM(o.total_amount) AS product_revenue,
             SUM(o.total_amount) / SUM(SUM(o.total_amount)) OVER (PARTITION BY p.category) * 100 AS revenue_contribution_percent
      FROM orders o
      INNER JOIN products p ON o.product_id = p.product_id
      GROUP BY p.product_name, p.category;
    

7. Solution 4: Tính tổng số lượng sản phẩm đã bán theo từng danh mục và từng phương thức thanh toán

  • Yêu cầu: Tính tổng số lượng sản phẩm (total_quantity) đã bán theo từng danh mục (category) và từng phương thức thanh toán (payment_method).

  • Giải pháp:

      SELECT p.category, o.payment_method, SUM(o.quantity) AS total_quantity
      FROM orders o
      INNER JOIN products p ON o.product_id = p.product_id
      GROUP BY p.category, o.payment_method;
    

8. Solution 5: Tìm các cặp sản phẩm có cùng danh mục và giá tương đương

  • Yêu cầu: Tìm các cặp sản phẩm có cùng danh mục (category) và giá (price) chênh lệch không quá 10%.

  • Giải pháp:

      SELECT p1.product_name AS product1, p2.product_name AS product2, p1.category, p1.price AS price1, p2.price AS price2
      FROM products p1
      INNER JOIN products p2 ON p1.category = p2.category 
                              AND p1.product_id < p2.product_id
                              AND ABS(p1.price - p2.price) / p1.price <= 0.1;
    

9. Solution 6: Phân tích doanh thu tích lũy theo từng tháng

  • Yêu cầu: Tính tổng doanh thu tích lũy (cumulative_revenue) theo từng tháng.

  • Giải pháp:

      SELECT EXTRACT(MONTH FROM order_date) AS order_month, 
             SUM(total_amount) AS monthly_revenue,
             SUM(SUM(total_amount)) OVER (ORDER BY EXTRACT(MONTH FROM order_date)) AS cumulative_revenue
      FROM orders
      GROUP BY order_month
      ORDER BY order_month;
    

10. Solution 7: Tìm khoảng thời gian giữa hai đơn hàng liên tiếp của cùng một khách hàng

  • Yêu cầu: Tính khoảng thời gian (số ngày) giữa hai đơn hàng liên tiếp của cùng một khách hàng.

  • Giải pháp:

      SELECT customer_id, order_date,
             LAG(order_date) OVER (PARTITION BY customer_id ORDER BY order_date) AS prev_order_date,
             order_date - LAG(order_date) OVER (PARTITION BY customer_id ORDER BY order_date) AS days_between_orders
      FROM orders;
    

11. Today's slides

  • Tổng kết lại các giải pháp và kết quả của dự án.

  • Cung cấp slide tham khảo để bạn ôn tập và thực hành thêm.


12. Today's summary

  • Hôm nay, bạn đã hoàn thành dự án phân tích dữ liệu E-commerce bằng cách sử dụng các kiến thức SQL nâng cao.

  • Bạn đã thực hiện các phân tích như:

    • Phân tích doanh thu theo danh mục và thời gian.

    • Tìm kiếm khách hàng và sản phẩm nổi bật.

    • Phân tích tỷ lệ đóng góp doanh thu và khoảng thời gian giữa các đơn hàng.

  • Hẹn gặp lại bạn vào ngày 14 với chủ đề Pro: Stored Procedures, Transactions & User-Defined Functions!


13. Today's challenges

  • Thử thách 1: Tính tổng doanh thu (total_amount) theo từng danh mục (category) và từng phương thức thanh toán (payment_method) bằng GROUPING SETS.

  • Thử thách 2: Tìm các cặp khách hàng (customer_name) đến từ cùng một thành phố (city) và có tổng giá trị đơn hàng tương đương.

  • Thử thách 3: Phân tích doanh thu tích lũy theo từng phương thức thanh toán (payment_method).