Day 3 - Basics: Grouping

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


1. Today's plan

  • Hôm nay, chúng ta sẽ học cách nhóm dữ liệu và sử dụng các hàm tổng hợp để phân tích dữ liệu trong hệ thống E-commerce.

  • Các chủ đề chính:

    • Aggregate functions: Các hàm tổng hợp như COUNT, SUM, AVG, MIN, MAX.

    • GROUP BY: Nhóm dữ liệu theo một hoặc nhiều cột.

    • HAVING: Lọc dữ liệu sau khi nhóm.


2. Aggregate functions

  • Các hàm tổng hợp phổ biến:

    • COUNT(): Đếm số lượng bản ghi.

    • SUM(): Tính tổng giá trị.

    • AVG(): Tính giá trị trung bình.

    • MIN(): Tìm giá trị nhỏ nhất.

    • MAX(): Tìm giá trị lớn nhất.

  • Ví dụ:

      SELECT COUNT(*) AS total_orders FROM orders;
    

    Câu lệnh này sẽ trả về tổng số đơn hàng trong bảng orders.


3. Challenge: Aggregate function

  • Yêu cầu: Viết truy vấn để tính tổng giá trị (total_amount) của tất cả đơn hàng trong bảng orders.

4. Solution: Aggregate function

  • Giải pháp:

      SELECT SUM(total_amount) AS total_revenue FROM orders;
    

5. GROUP BY

  • GROUP BY dùng để nhóm dữ liệu theo một hoặc nhiều cột.

  • Ví dụ:

      SELECT category, COUNT(*) AS product_count FROM products GROUP BY category;
    

    Câu lệnh này sẽ trả về số lượng sản phẩm trong mỗi danh mục.


6. Challenge: GROUP BY

  • Yêu cầu: Viết truy vấn để tính tổng giá trị (total_amount) của các đơn hàng theo từng phương thức thanh toán (payment_method) trong bảng orders.

7. Solution: GROUP BY

  • Giải pháp:

      SELECT payment_method, SUM(total_amount) AS total_revenue FROM orders GROUP BY payment_method;
    

8. GROUP BY multiple columns

  • GROUP BY có thể nhóm dữ liệu theo nhiều cột.

  • Ví dụ:

      SELECT category, supplier, COUNT(*) AS product_count FROM products GROUP BY category, supplier;
    

    Câu lệnh này sẽ trả về số lượng sản phẩm trong mỗi danh mục và nhà cung cấp.


9. Challenge: GROUP BY multiple columns

  • Yêu cầu: Viết truy vấn để tính tổng giá trị (total_amount) của các đơn hàng theo từng phương thức thanh toán (payment_method) và năm đặt hàng (order_date) trong bảng orders.

10. Solution: GROUP BY multiple columns

  • Giải pháp:

      SELECT payment_method, EXTRACT(YEAR FROM order_date) AS order_year, SUM(total_amount) AS total_revenue 
      FROM orders 
      GROUP BY payment_method, EXTRACT(YEAR FROM order_date);
    

11. HAVING

  • HAVING dùng để lọc dữ liệu sau khi nhóm.

  • Ví dụ:

      SELECT category, COUNT(*) AS product_count FROM products GROUP BY category HAVING COUNT(*) > 10;
    

    Câu lệnh này sẽ trả về các danh mục có số lượng sản phẩm lớn hơn 10.


12. Challenge: HAVING

  • Yêu cầu: Viết truy vấn để tìm các phương thức thanh toán (payment_method) có tổng giá trị đơn hàng (total_amount) lớn hơn 1000 trong bảng orders.

13. Solution: HAVING

  • Giải pháp:

      SELECT payment_method, SUM(total_amount) AS total_revenue 
      FROM orders 
      GROUP BY payment_method 
      HAVING SUM(total_amount) > 1000;
    

14. Introducing the second project

  • Giới thiệu dự án thứ hai: Phân tích doanh thu theo danh mục sản phẩm.

  • Bạn sẽ sử dụng các kiến thức đã học để phân tích doanh thu từ các danh mục sản phẩm khác nhau.


15. Note for Mac users

  • Nếu bạn sử dụng Mac, hãy đảm bảo rằng PostgreSQL và pgAdmin đã được cài đặt và cấu hình đúng cách.

  • Nếu gặp vấn đề, hãy tham khảo lại hướng dẫn cài đặt trong Day 1.


16. Important: Problems & solutions of setting up the database

  • Một số vấn đề thường gặp khi thiết lập database:

    • Lỗi kết nối: Kiểm tra lại thông tin đăng nhập và cổng kết nối.

    • Chậm hiệu năng: Đóng các ứng dụng không cần thiết và tăng bộ nhớ RAM.

    • Lỗi cú pháp: Kiểm tra lại câu lệnh SQL và đảm bảo rằng các bảng và cột đã được tạo đúng cách.


17. Today's summary

  • Hôm nay, bạn đã học:

    • Cách sử dụng các hàm tổng hợp như COUNT, SUM, AVG, MIN, và MAX.

    • Cách nhóm dữ liệu với GROUP BY.

    • Cách lọc dữ liệu sau khi nhóm với HAVING.

  • Hẹn gặp lại bạn vào ngày 4 với chủ đề Intermediate: Functions!


18. Today's challenges

  • Thử thách 1: Viết truy vấn để tính số lượng đơn hàng (order_count) và tổng giá trị (total_revenue) của các đơn hàng theo từng khách hàng (customer_id) trong bảng orders.

  • Thử thách 2: Viết truy vấn để tìm các danh mục sản phẩm (category) có số lượng sản phẩm (product_count) lớn hơn 5 trong bảng products.

  • Thử thách 3: Viết truy vấn để tính giá trung bình (average_price) của các sản phẩm theo từng danh mục (category) trong bảng products.