在Oracle 10g中,沒有PIVOT
功能,但你可以使用聚合與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;
見SQL Fiddle with Demo
如果你的Oracle 11g +,那麼你可以使用PIVOT
功能:
select *
from temp
pivot
(
sum(cnt)
for tp in ('T1', 'T2', 'T3')
) piv
見SQL Fiddle with Demo
如果你有一個未知的數值進行改造的,那麼你可以創建一個過程來產生這個動態的版本:
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;
/
然後執行該代碼:
variable x refcursor
exec dynamic_pivot(:x)
print x
結果所有版本是相同的:
| USR | T1 | T2 | T3 |
----------------------
| 1 | 17 | 0 | 0 |
| 2 | 0 | 21 | 1 |
| 3 | 45 | 0 | 0 |
編輯:基於您的評論,如果你想有一個Total
˚F ield,最簡單的方法是將查詢放置另一個SELECT
類似這樣的內部:
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;
見SQL Fiddle with Demo
不知道如何做到這一點 – F11
你需要給出一個更明顯的例子你的結果應與樣本表一致。 –
@JoachimIsaksson請查看編輯問題 – F11