sql >> Databasteknik >  >> RDS >> Oracle

oracle :Dynamiskt kolumnnamn

Eftersom du använder Oracle10g finns det ingen PIVOT funktion så du måste utföra den här typen av transformation med en aggregerad funktion med en CASE uttalande.

Om värdena är kända i förväg kan du hårdkoda dem i en statisk version:

select s.ts_location,
  sum(case when p.tp_name = 'apple' then s.ts_sales else 0 end) Apple,
  sum(case when p.tp_name = 'mango' then s.ts_sales else 0 end) Mango,
  sum(case when p.tp_name = 'pineapple' then s.ts_sales else 0 end) Pineapple
from tbl_sales s
inner join tbl_products p
  on s.ts_tp_id = p.tp_id
group by s.ts_location

Se SQL-fiol med demo

Men om dina värden inte är kända i förväg måste du implementera dynamisk sql och i Oracle kommer du att vilja använda en procedur för detta:

CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select s.ts_location ';

    begin
        for x in (select distinct tp_name from tbl_products order by 1)
        loop
            sql_query := sql_query ||
                ' , sum(case when p.tp_name = '''||x.tp_name||''' then s.ts_sales end) as '||x.tp_name;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from tbl_sales s 
                                                inner join tbl_products p
                                                  on s.ts_tp_id = p.tp_id
                                                group by s.ts_location';
        dbms_output.put_line(sql_query);

        open p_cursor for sql_query;
    end;
/

För att sedan returnera resultaten kan du använda (obs: så här gör jag i Toad):

variable x refcursor
exec dynamic_pivot(:x)
print x

Båda returnerar resultatet:

| TS_LOCATION | APPLE | MANGO | PINEAPPLE |
-------------------------------------------
|          LN |     0 |    10 |        35 |
|          QL |    25 |     0 |        20 |
|          NY |   100 |     5 |        50 |



  1. Hur man hittar EBS R12 komponenter Version

  2. Förklara FOR i orakel

  3. Mysql group_concat med summor också inuti

  4. Hur man installerar Nextcloud 15 på Ubuntu 18.04