Vì bạn đang sử dụng Oracle10g nên không có PIVOT
vì vậy bạn sẽ phải thực hiện kiểu chuyển đổi này bằng cách sử dụng hàm tổng hợp với CASE
tuyên bố.
Nếu các giá trị được biết trước, thì bạn có thể mã hóa chúng trong phiên bản tĩnh:
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
Nhưng nếu các giá trị của bạn không được biết trước, thì bạn phải triển khai sql động và trong Oracle, bạn sẽ muốn sử dụng một thủ tục cho việc này:
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;
/
Sau đó, để trả về kết quả, bạn có thể sử dụng ( ghi chú: đây là cách tôi thực hiện trong Toad):
variable x refcursor
exec dynamic_pivot(:x)
print x
Cả hai sẽ trả về kết quả:
| TS_LOCATION | APPLE | MANGO | PINEAPPLE |
-------------------------------------------
| LN | 0 | 10 | 35 |
| QL | 25 | 0 | 20 |
| NY | 100 | 5 | 50 |