我正在使用 oracle 10g。
我有一个临时表 TEMP。
TEMP 具有以下结构:-
USER COUNT TYPE
---- ----- ----
1 10 T1
2 21 T2
3 45 T1
1 7 T1
2 1 T3
我需要一个查询来显示所有类型都有列名,类型可以有任何值,如
T1, T2,..Tn
并且结果将是这样的:-USER T1 T2 T3
---- -- -- --
1 17 0 0
2 0 21 1
3 45 0 0
User 列将显示所有用户,
T1, T2
列将显示类型的总数。
最佳答案
在 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
字段,最简单的方法是将查询放在另一个类似于这个的 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
关于sql - 以 Oracle 10g 为中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13410464/