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

oracle :Dynamisk kolonnenavn

Da du bruger Oracle10g, er der ingen PIVOT funktion, så du bliver nødt til at udføre denne type transformation ved hjælp af en aggregeret funktion med en CASE erklæring.

Hvis værdierne er kendt i forvejen, kan du hårdkode 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 Fiddle with Demo

Men hvis dine værdier ikke er kendt på forhånd, så skal du implementere dynamisk sql og i Oracle vil du bruge en procedure til dette:

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

Derefter kan du bruge resultaterne for at returnere (bemærk: sådan gør jeg det i Toad):

variable x refcursor
exec dynamic_pivot(:x)
print x
 

Begge vil returnere resultatet:

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


  1. Kan jeg tilslutte mig på tværs af datakilder i SSRS?

  2. Hvordan kan jeg fjerne disse (â?²s) type tegn med PHP?

  3. Gå gennem MySQL til venstre, deltag i php vs. 2 separate forespørgsler

  4. [MySQL]:Hvad er indsamlingsmetode?