Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tạo dạng xem Pivot trong SQL từ bảng SQL

Một hàm được lưu trữ ( hoặc thủ tục ) có thể được tạo để tạo SQL cho Dynamic Pivoting và tập kết quả được tải vào một biến kiểu SYS_REFCURSOR :

CREATE OR REPLACE FUNCTION Get_Categories_RS RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767);
  v_cols_1    VARCHAR2(32767);
  v_cols_2    VARCHAR2(32767);  
BEGIN
  SELECT LISTAGG( ''''||"level"||''' AS "'||"level"||'"' , ',' )
          WITHIN GROUP ( ORDER BY "level" DESC )
    INTO v_cols_1
    FROM (
          SELECT DISTINCT "level"
            FROM temp
          );

  SELECT LISTAGG( 'MAX(CASE WHEN category = '''||category||''' THEN "'||"level"||'" END) AS "'||"level"||'_'||category||'"' , ',' )
          WITHIN GROUP ( ORDER BY category, "level" DESC )
    INTO v_cols_2
    FROM (
          SELECT DISTINCT "level", category
            FROM temp
          );

  v_sql :=
  'SELECT "set", '|| v_cols_2 ||'
     FROM
     (
      SELECT *
        FROM temp
       PIVOT
       (
        MAX(value) FOR "level" IN ( '|| v_cols_1 ||' )
       )
      )
      GROUP BY "set"
      ORDER BY "set"'; 

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;

trong đó tôi đã sử dụng hai mức xoay vòng:mức đầu tiên nằm trong truy vấn bên trong liên quan đến PIVOT Mệnh đề và mệnh đề thứ hai là trong truy vấn bên ngoài có logic tổng hợp có điều kiện. Lưu ý rằng thứ tự các cấp phải theo thứ tự giảm dần (Z , Y , X ) trong kết quả mong đợi vì phù hợp với mô tả.

Và sau đó gọi

VAR rc REFCURSOR
EXEC :rc := Get_Categories_RS;
PRINT rc

từ Dòng lệnh của Nhà phát triển SQL để có được tập hợp kết quả

Btw, tránh sử dụng các từ khóa dành riêng như setlevel như trong trường hợp của bạn. Tôi cần phải trích dẫn chúng để có thể sử dụng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle TNS tên không hiển thị khi thêm kết nối mới vào SQL Developer

  2. Sử dụng IS NULL hoặc IS NOT NULL với các điều kiện tham gia - Câu hỏi lý thuyết

  3. Cách tốt nhất để thực hiện chèn nhiều hàng trong Oracle?

  4. SQL Server:làm thế nào để bắt chước truy vấn oracle keep secure_rank?

  5. chèn hàng loạt từ Java vào Oracle