我有数据库表。正如我进一步看到的那样,数据采用特定格式。如何在不直接使用查询创建临时表的情况下执行以下转换?col2 不是静态字段 X 和 Y,它是动态确定的,即没有列是动态的。
问问题
193 次
2 回答
2
您没有指定您使用的是哪个版本的 Oracle,所以这里有一些解决方案。
如果您使用的是 Oracle 11g+,那么您可以访问该PIVOT
功能:
select *
from
(
select col1, col2, col3
from yourtable
) src
pivot
(
max(col3)
for col2 in ('X', 'Y')
) piv
如果您使用的是另一个版本的 Oracle,那么您可以使用带有CASE
语句的聚合函数:
select col1,
min(case when col2 = 'X' then col3 end) X,
min(case when col2 = 'Y' then col3 end) Y
from yourtable
group by col1
如果你有未知数量的col2
值,那么你可以在 oracle 中创建一个过程来生成动态 sql:
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
sql_query varchar2(1000) := 'select col1 ';
begin
for x in (select distinct col2 from yourtable order by 1)
loop
sql_query := sql_query ||
' , min(case when col2 = '''||x.col2||''' then col3 end) as '||x.col2;
dbms_output.put_line(sql_query);
end loop;
sql_query := sql_query || ' from yourtable group by col1';
open p_cursor for sql_query;
end;
/
然后执行它:
variable x refcursor
exec dynamic_pivot(:x)
print x
结果应该是一样的:
| COL1 | X | Y |
--------------------
| A | 1 | 3 |
| B | 2 | 4 |
于 2012-11-08T10:29:44.817 回答
1
select
col1 " ",
sum(case when col2='X' then col3 else 0 end) x,
sum(case when col2='Y' then col3 else 0 end) y
from sample
group by col1
==
此问题的 SQL Fiddle 演示
于 2012-11-08T10:34:43.107 回答