Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dynamiczne obracanie tabeli Oracle

Można to zrobić dynamicznie w następujący sposób. Po pierwsze, oto statyczna wersja zapytania, dzięki czemu możesz zobaczyć ostateczny sql:

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

Zobacz SQL Fiddle z demonstracją

Następnie, aby zrobić to dynamicznie, możesz utworzyć następującą procedurę:

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;
/

Następnie, aby go wykonać:

variable x refcursor
exec dynamic_pivot(:x)
print x

Wynik jest taki sam:

|   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. Jak zresetować sekwencję w Oracle?

  2. Różnica między Oracle IN a Exists?

  3. SQL nie rozpoznaje aliasu kolumny w klauzuli where

  4. Sejf TO_NUMBER()

  5. zwiększaj numer wiersza, gdy zmienia się wartość pola w Oracle