Karena Anda menggunakan Oracle10g, tidak ada PIVOT
fungsi sehingga Anda harus melakukan jenis transformasi ini menggunakan fungsi agregat dengan CASE
pernyataan.
Jika nilainya sudah diketahui sebelumnya, Anda dapat membuat kode keras dalam versi statis:
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
Lihat SQL Fiddle dengan Demo
Tetapi jika nilai Anda tidak diketahui sebelumnya, maka Anda harus mengimplementasikan sql dinamis dan di Oracle Anda akan ingin menggunakan prosedur untuk ini:
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;
/
Kemudian untuk mengembalikan hasil yang dapat Anda gunakan (catatan: ini adalah bagaimana saya melakukannya di Toad):
variable x refcursor
exec dynamic_pivot(:x)
print x
Keduanya akan mengembalikan hasilnya:
| TS_LOCATION | APPLE | MANGO | PINEAPPLE |
-------------------------------------------
| LN | 0 | 10 | 35 |
| QL | 25 | 0 | 20 |
| NY | 100 | 5 | 50 |