All about Oracle Technologies

Friday, 2 October 2015

PIVOT và UNPIVOT (Phần 3)

Bài viết này sẽ giới thiệu cách PIVOT với số lượng cột không giới hạn.

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ả:
(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ả:
(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ả:
(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

2 comments :