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

Oracle xoay các hàng thành cột

Một tùy chọn sẽ được sử dụng PIVOT Mệnh đề

SELECT *
  FROM (SELECT t1.*, t2.tipo, t2.valor 
          FROM table1 t1 
          JOIN table2 t2 
            ON t2.id = t1.id)
 PIVOT 
 (
  MAX(valor) FOR tipo IN ( 't1' AS "t1", 't2' AS "t2", 't3' AS "t3" )
 )  

nhưng điều này là tĩnh, ví dụ. cần được cập nhật dưới dạng các giá trị khác nhau cho tipo cột được thêm vào. Để làm cho nó động, bạn có thể tạo một hàm

CREATE OR REPLACE FUNCTION Get_Pivoted_Cols RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767); 
  v_cols      VARCHAR2(32767);      
BEGIN
  SELECT LISTAGG( ''''||tipo||''' AS "'||tipo||'"' , ',' )
          WITHIN GROUP ( ORDER BY tipo )  
    INTO v_cols
    FROM ( SELECT DISTINCT tipo FROM table2 );

  v_sql := 'SELECT *
              FROM (SELECT t1.*, t2.tipo, t2.valor 
                      FROM table1 t1 
                      JOIN table2 t2 
                        ON t2.id = t1.id)
             PIVOT 
             (
              MAX(valor) FOR tipo IN ( '|| v_cols ||' )
             )';   

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;
/

và sau đó gọi bằng cách sử dụng

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

từ bảng điều khiển của nhà phát triển SQL.

Bản trình diễn



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cú pháp SQL Oracle:Mã định danh được trích dẫn

  2. Oracle - Cách buộc người dùng CHÈN nhiều hàng

  3. ROWNUM hoạt động như thế nào trong truy vấn phân trang?

  4. Oracle - Đường mòn kiểm tra cho một người dùng cụ thể

  5. Tạo Biểu mẫu trong APEX để đặt Biến trong Truy vấn cho Báo cáo tương tác