Trong Oracle 10g, không có PIVOT
nhưng bạn có thể sao chép nó bằng cách sử dụng tổng hợp với CASE
:
select usr,
sum(case when tp ='T1' then cnt else 0 end) T1,
sum(case when tp ='T2' then cnt else 0 end) T2,
sum(case when tp ='T3' then cnt else 0 end) T3
from temp
group by usr;
Xem SQL Fiddle với Demo
Nếu bạn có Oracle 11g + thì bạn có thể sử dụng PIVOT
chức năng:
select *
from temp
pivot
(
sum(cnt)
for tp in ('T1', 'T2', 'T3')
) piv
Xem SQL Fiddle với Demo
Nếu bạn có một số lượng giá trị không xác định để chuyển đổi, thì bạn có thể tạo một thủ tục để tạo một phiên bản động của cái này:
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
sql_query varchar2(1000) := 'select usr ';
begin
for x in (select distinct tp from temp order by 1)
loop
sql_query := sql_query ||
' , sum(case when tp = '''||x.tp||''' then cnt else 0 end) as '||x.tp;
dbms_output.put_line(sql_query);
end loop;
sql_query := sql_query || ' from temp group by usr';
open p_cursor for sql_query;
end;
/
sau đó để thực thi mã:
variable x refcursor
exec dynamic_pivot(:x)
print x
Kết quả cho tất cả các phiên bản là như nhau:
| USR | T1 | T2 | T3 |
----------------------
| 1 | 17 | 0 | 0 |
| 2 | 0 | 21 | 1 |
| 3 | 45 | 0 | 0 |
Chỉnh sửa:Dựa trên nhận xét của bạn nếu bạn muốn Total
, cách dễ nhất là đặt truy vấn bên trong một SELECT
khác tương tự như sau:
select usr,
T1 + T2 + T3 as Total,
T1,
T2,
T3
from
(
select usr,
sum(case when tp ='T1' then cnt else 0 end) T1,
sum(case when tp ='T2' then cnt else 0 end) T2,
sum(case when tp ='T3' then cnt else 0 end) T3
from temp
group by usr
) src;
Xem SQL Fiddle với Demo