Тъй като използвате Oracle10g, няма PIVOT
функция, така че ще трябва да извършите този тип трансформация с помощта на агрегатна функция с CASE
изявление.
Ако стойностите са известни предварително, тогава можете да ги кодирате твърдо в статична версия:
изберете 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) ) Манго, sum(case when p.tp_name ='ananaps' then s.ts_sales else 0 end) Pineapplefrom tbl_sales sinner join tbl_products p on s.ts_tp_id =p.tp_idgroup by s.ts_location
Вижте SQL Fiddle с демонстрация
Но ако вашите стойности не са известни предварително, тогава трябва да внедрите динамичен sql и в Oracle ще искате да използвате процедура за това:
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)as sql_query varchar2(1000) :='select s.ts_location '; начало за x в (изберете различно tp_name от tbl_products подредете по 1) цикъл sql_query :=sql_query || ' , сума (случай, когато p.tp_name ='''||x.tp_name||''' тогава s.ts_sales край) като '||x.tp_name; dbms_output.put_line(sql_query); крайна линия; sql_query :=sql_query || 'от tbl_sales s inner join tbl_products p на s.ts_tp_id =p.tp_id група от s.ts_location'; dbms_output.put_line(sql_query); отворете p_cursor за sql_query; край;/
След това, за да върнете резултатите, които можете да използвате (забележка: ето как го правя в Toad):
променлива x refcursorexec dynamic_pivot(:x)print x
И двете ще върнат резултата:
<предварителен код>| TS_LOCATION | ЯБЪЛКА | МАНГО | АНАНАС |------------------------------------------| LN | 0 | 10 | 35 || QL | 25 | 0 | 20 || Ню Йорк | 100 | 5 | 50 |