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

Tự động xoay bảng Oracle

Điều này có thể được thực hiện động theo cách sau. Đầu tiên, đây là phiên bản tĩnh của truy vấn để bạn có thể xem sql cuối cùng:

select c_id,
  p_id,
  max(case when r_key= 'KEY1' then r_value  end) KEY1,
  max(case when r_key= 'KEY2' then r_value  end) KEY2,
  max(case when r_key= 'KEY3' then r_value  end) KEY3,
  max(case when r_key= 'KEY4' then r_value  end) KEY4,
  max(case when r_key= 'KEY5' then r_value  end) KEY5
from s_projectroles
group by c_id, p_id

Xem SQL Fiddle với Demo

Sau đó, để thực hiện điều này động, bạn có thể tạo quy trình sau:

CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select c_id, P_id ';

    begin
        for x in (select distinct r_key from s_projectroles order by 1)
        loop
            sql_query := sql_query ||
              ' , max(case when r_key = '''||x.r_key||''' then r_value end) as '||x.r_key;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from s_projectroles group by c_id, p_id';

        open p_cursor for sql_query;
    end;
/

Sau đó, để thực thi nó:

variable x refcursor
exec dynamic_pivot(:x)
print x

Kết quả là như nhau:

|   C_ID |   P_ID |   KEY1 |   KEY2 |   KEY3 |   KEY4 |   KEY5 |
----------------------------------------------------------------
| (null) | (null) | VALUE1 | VALUE2 | VALUE3 | (null) | (null) |
|      2 |      2 | (null) | (null) | (null) | VALUE4 | (null) |
|      2 |      3 | (null) | (null) | (null) | (null) | VALUE5 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thêm ngày vào dấu thời gian

  2. Làm thế nào chúng ta có thể xác định kích thước tham số đầu ra trong thủ tục được lưu trữ?

  3. Làm cách nào để CHỌN từ cột kiểu đối tượng trong Oracle 11g?

  4. Quản lý doanh nghiệp Điều khiển FMW 11g trong R12.2

  5. Xoay vòng trên Oracle 10g