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

Xoay vòng với các cột động trong Oracle

SYS_REFCURSOR trong một hàm được lưu trữ ( ví dụ:PL / SQL được sử dụng thay vì sử dụng SQL trực tiếp ) có thể được sử dụng để nhận tập kết quả được tạo động (ví dụ: Dynamic Pivot ). Trong trường hợp này, một chuỗi cho Tổng hợp có điều kiện được tạo:

CREATE OR REPLACE FUNCTION get_passengers_rs RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767);
  v_str       VARCHAR2(32767);
BEGIN
  SELECT LISTAGG('MAX(CASE WHEN rn = '||lvl||' THEN age||''(''||passengers||'')'' END) 
                   AS "Age'||lvl||'"' ,',') WITHIN GROUP (ORDER BY 0)
    INTO v_str
    FROM ( SELECT level AS lvl  
             FROM dual
          CONNECT BY level <= (SELECT MAX(COUNT(*)) FROM t GROUP BY ID ) ) t;  

  v_sql :=
  'SELECT ID, '|| v_str ||'
     FROM 
     (
      SELECT t.*, 
             ROW_NUMBER() OVER (PARTITION BY ID ORDER BY 0) AS rn
        FROM t     
      )
    GROUP BY ID';

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;

Tôi cũng đã thêm tên của hành khách để phân biệt rõ từng dữ liệu.

Sau đó chạy đoạn mã dưới đây:

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

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

Đoạn mã trên tạo chuỗi SQL này ( v_sql ) cho dữ liệu hiện có

SELECT ID, MAX(CASE WHEN rn = 1 THEN age||'('||passengers||')' END) AS "Age1",
           MAX(CASE WHEN rn = 2 THEN age||'('||passengers||')' END) AS "Age2",
           MAX(CASE WHEN rn = 3 THEN age||'('||passengers||')' END) AS "Age3"
  FROM 
     (
      SELECT t.*, 
             ROW_NUMBER() OVER (PARTITION BY ID ORDER BY 0) AS rn
        FROM t     
      )
 GROUP BY ID

cái nào mang lại

ID      Age1        Age2            Age3
123456  58(Marie)   65(Ben) 
123458  32(Aaron)   18(Caroline)    37(Stephanie)

như kết quả đã đặt.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể tải tệp hoặc lắp ráp cho Oracle.DataAccess trong .NET

  2. làm thế nào để tăng chiều dài đầu ra cột sqlplus?

  3. Oracle Concurrent Manager - Trình phân tích CP cho E-Business Suite

  4. Tham số Dapper.net Oracle

  5. Làm cách nào để lấy danh sách các tháng giữa 2 ngày nhất định bằng cách sử dụng truy vấn?