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).