Trong thời đại số hóa hiện nay, việc phân tích và xử lý dữ liệu trở nên vô cùng quan trọng đối với mọi lĩnh vực. SQL (Structured Query Language) là một công cụ mạnh mẽ giúp chúng ta truy vấn và quản lý dữ liệu một cách hiệu quả. Bài viết này sẽ hướng dẫn bạn cách giải quyết một Case Study cụ thể bằng SQL, từ đó giúp bạn nắm vững các kỹ năng cần thiết để áp dụng vào thực tế. Chúng ta sẽ cùng nhau khám phá các bước từ việc hiểu rõ yêu cầu của bài toán, xây dựng các truy vấn SQL phù hợp, đến việc phân tích và trình bày kết quả một cách rõ ràng và logic. Hãy cùng bắt đầu hành trình chinh phục SQL qua Case Study này nhé!
Tình huống
Data Mart là một siêu thị trực tuyến chuyên về các sản phẩm nông sản tươi. Vào tháng 6 năm 2020, Data Mart đã thực hiện thay đổi chuỗi cung ứng quy mô lớn. Tất cả các sản phẩm của Data Mart hiện nay đều sử dụng phương pháp đóng gói bền vững trong mọi khâu, từ nông trại đến tay khách hàng.
Danny cần sự giúp đỡ của bạn để phân tích và định lượng tác động của sự thay đổi này đến hiệu suất bán hàng của Data Mart.
Câu hỏi kinh doanh then chốt cần trả lời
– Tác động định lượng của những thay đổi được đưa ra vào tháng 6 năm 2020 là gì?
– Nền tảng, khu vực, phân khúc và loại khách hàng nào bị ảnh hưởng nhiều nhất bởi sự thay đổi này?
– Chúng ta có thể làm gì đối với việc triển khai các bản cập nhật tính bền vững tương tự trong tương lai cho doanh nghiệp để giảm thiểu tác động đến doanh số?
Một vài lưu ý
– Data Mart hoạt động trên phạm vi quốc tế.
– Data Mart có cả nền tảng bán lẻ và trực tuyến thông qua cửa hàng Shopify để phục vụ khách hàng.
– Dữ liệu phân khúc khách hàng (segment) và loại khách hàng (customer_type) liên quan đến thông tin nhân khẩu học và độ tuổi được chia sẻ với Data Mart.
– Giao dịch (transaction) là số lượng mua hàng độc nhất được thực hiện thông qua Data Mart và doanh số (sales) là tổng số tiền thực tế của các lần mua hàng với đơn vị là đô la.
– Mỗi bản ghi trong bộ dữ liệu liên quan đến một phân đoạn tổng hợp cụ thể của dữ liệu bán hàng và được gom thành giá trị week_date (ngày bắt đầu tuần).
– 5 dòng dữ liệu mẫu được hiển thị trong bảng kết quả bên dưới từ data_mart.weekly_sales.
Quá Trình Làm Sạch Dữ Liệu (Data Cleaning)
Nhiệm vụ: Tạo một bảng mới tên clean_weekly_sales với dữ liệu đã được làm sạch
1. Chuyển đổi week_date sang định dạng DATE: Chuyển đổi cột week_date từ dạng hiện tại sang định dạng ngày chuẩn (DATE)
TO_DATE(week_date, ‘DD/MM/YY’) AS week_date
2. Thêm cột week_number: Thêm cột thứ hai week_number thể hiện số thứ tự của tuần trong năm. Ví dụ, các giá trị từ 1 tháng 1 đến 7 tháng 1 sẽ có week_number là 1, từ 8 đến 14 tháng 1 sẽ có week_number là 2, …
DATE_PART(‘week’, TO_DATE(week_date, ‘DD/MM/YY’)) AS week_number
3. Thêm cột month_number: Thêm cột thứ ba month_number thể hiện tháng theo lịch (1-12) cho mỗi giá trị week_date.
DATE_PART(‘month’, TO_DATE(week_date, ‘DD/MM/YY’)) AS month_number
4. Thêm cột calendar_year: Thêm cột thứ tư calendar_year chứa giá trị năm (2018, 2019 hoặc 2020) tương ứng với mỗi week_date.
DATE_PART(‘year’, TO_DATE(week_date, ‘DD/MM/YY’)) AS calendar_year
5. Thêm cột age_band (độ tuổi): Thêm cột age_band sau cột segment. Điều kiện như sau: “Young Adults (Thanh niên)” nếu chữ số trong segment là 1, “Middle Aged (Trung niên)” nếu chữ số là 2, “Retirees (Nghỉ hưu)” nếu chữ số trong segment là 3 hoặc 4. Thay thế các giá trị null (nếu có) bằng chuỗi “unknown”.
CASE
WHEN RIGHT(segment,1) = ‘1’ THEN ‘Young Adults’
WHEN RIGHT(segment,1) = ‘2’ THEN ‘Middle Aged’
WHEN RIGHT(segment,1) in (‘3′,’4’) THEN ‘Retirees’
ELSE ‘unknown’ END AS age_band
6. Thêm cột demographic (nhân khẩu): Thêm cột demographic sau cột age_band. Điều kiện như sau: “Couples (Cặp đôi)” nếu chữ cái trong segment là C, “Families (Gia đình)” nếu chữ cái là D. Thay thế các giá trị null (nếu có) bằng chuỗi “unknown”.
CASE
WHEN LEFT(segment,1) = ‘C’ THEN ‘Couples’
WHEN LEFT(segment,1) = ‘F’ THEN ‘Families’
ELSE ‘unknown’ END AS demographic,
7. Tính cột avg_transaction (giao dịch trung bình): Sử dụng phép toán chia giữa sales và transactions, làm tròn kết quả đến 2 chữ số thập phân.
ROUND((sales::NUMERIC/transactions),2) AS avg_transaction
Ghép các dòng code trên và chọn hiển thị 5 dòng đầu:
DROP TABLE IF EXISTS clean_weekly_sales;
CREATE TEMP TABLE clean_weekly_sales AS (
SELECT
TO_DATE(week_date, ‘DD/MM/YY’) AS week_date,
DATE_PART(‘week’, TO_DATE(week_date, ‘DD/MM/YY’)) AS week_number,
DATE_PART(‘month’, TO_DATE(week_date, ‘DD/MM/YY’)) AS month_number,
DATE_PART(‘year’, TO_DATE(week_date, ‘DD/MM/YY’)) AS calendar_year,
region,
platform,
segment,
CASE
WHEN RIGHT(segment,1) = ‘1’ THEN ‘Young Adults’
WHEN RIGHT(segment,1) = ‘2’ THEN ‘Middle Aged’
WHEN RIGHT(segment,1) in (‘3′,’4’) THEN ‘Retirees’
ELSE ‘unknown’ END AS age_band,
CASE
WHEN LEFT(segment,1) = ‘C’ THEN ‘Couples’
WHEN LEFT(segment,1) = ‘F’ THEN ‘Families’
ELSE ‘unknown’ END AS demographic,
transactions,
ROUND((sales::NUMERIC/transactions),2) AS avg_transaction,
sales
FROM data_mart.weekly_sales
);
SELECT *
FROM clean_weekly_sales
LIMIT 5;
Kết quả:
Xem thêm:
Giải Case Study cùng SQL: Hành vi khách hàng
Combo 3 Khóa học Business Intelligence