sql >> Database teknologi >  >> RDS >> Oracle

Dynamisk pivotering af et bord Oracle

Dette kan gøres dynamisk på følgende måde. For det første er her den statiske version af forespørgslen, så du kan se den endelige 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
 

Se SQL Fiddle with Demo

For derefter at gøre dette dynamisk, kan du oprette følgende procedure:

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

Så for at udføre det:

variable x refcursor
exec dynamic_pivot(:x)
print x
 

Resultatet er det samme:

| 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. Installation af Postgres på vinduer til brug med Ruby-on-Rails

  2. Brug af row_to_json() med indlejrede joinforbindelser

  3. Brug af SQL til at bestemme ordtællingsstatistikker for et tekstfelt

  4. Oprettelse af Oracle Sequence Trigger