Ở Phần 1, chúng ta thấy rằng khi PIVOT dữ liệu thì chúng ta phải xác định được số lượng cột trả về thông qua việc khai báo số lượng cột trong mệnh đề IN. Khi bảng dữ liệu của chúng ta có thêm/bớt giá trị thì bắt buộc chúng ta phải điều chỉnh lại câu lệnh PIVOT.
Bài viết này sử dụng hàm PIVOT của tác giả Anton để PIVOT cột động. Tham khảo bài viết gốc tại đây.
1. Thiết lập môi trường:
- Tải script tạo hàm PIVOT tại đây.
- Chạy script để tạo hàm.
2. Các kịch bản test với hàm PIVOT:
Tham khảo Phần 1 để có dữ liệu và câu lệnh mẫu để so sánh với phần này.
a. Yêu cầu 1: Thống kê kết quả bán hàng theo sản phẩm
Câu lệnh:
SELECT * FROM cust_sales PIVOT (SUM (sales) FOR product_id IN ('Prod A' AS product_a, 'Prod B' AS product_b, 'Prod C' AS product_c)); |
SELECT * FROM TABLE ( PIVOT ( 'select customer_id, month, product_id, sum(sales) sum_sales from cust_sales group by customer_id, month, product_id')); |
(Câu lệnh 1a - Hàm của Oracle)
|
(Câu lệnh 1b- Hàm của Anton)
|
(Kết quả câu lệnh 1a)
(Kết quả câu lệnh 1b)
b. Yêu cầu 2: Thống kê kết quả bán hàng theo tháng
Câu lệnh:
SELECT * FROM cust_sales PIVOT (SUM (sales) FOR month IN ('Jan' AS january, 'Feb' AS february, 'Mar' AS march)); |
SELECT * FROM TABLE ( PIVOT ('select customer_id, product_id, month, sum(sales) sum_sales from cust_sales group by customer_id, product_id, month')); |
(Câu lệnh 2a - Hàm của Oracle)
|
(Câu lệnh 2b- Hàm của Anton)
|
(Kết quả câu lệnh 2a)
(Kết quả câu lệnh 2b)
c. Yêu cầu 3: Thống kê kết quả bán hàng theo khách hàng
Câu lệnh:
SELECT * FROM cust_sales PIVOT (SUM (sales) FOR customer_id IN ('Adam', 'Jones', 'Kanes')); |
SELECT * FROM TABLE ( PIVOT ('select month, product_id, customer_id, sum(sales) sum_sales from cust_sales group by month, product_id, customer_id')); |
(Câu lệnh 3a - Hàm của Oracle)
|
(Câu lệnh 3b- Hàm của Anton)
|
(Kết quả câu lệnh 3a)
(Kết quả câu lệnh 3b)
3. Tổng kết:Qua các ví dụ trên, chúng ta thấy rằng hàm PIVOT của Anton có các điểm lưu ý như sau:
- Số lượng cột tối thiểu là 3
- Cột thứ (n-1) chính là cột dùng để PIVOT
- Cột thứ n nếu dùng các hàm tổng hợp (SUM, COUNT, AVG, ...) thì bắt buộc phải có Alias
- Mệnh đề ORDER BY không có hiệu lực trong chuỗi SELECT
KHÔNG CHẠY ĐƯỢC VỚI DYNAMIC PIVOT
ReplyDeletemình cũng vậy
ReplyDelete