Oracle 在执行时间之前旋转未知数量的列
Oracle pivoting unknown number of column before execution time
我有这样的东西:
id cod
1 a
1 b
1 c
2 d
2 e
3 f
3 g
我需要这样的东西:
id cod 1 cod 2 cod 3
1 a b c
2 d e
3 f g
您了解无法知道在执行时间之前 oracle 必须生成多少列。
没有办法做到这一点。 Oracle 在编译查询时必须知道列数。
假设您使用这样的查询创建了一个视图。每次查看时,该视图都会有不同数量的列。
而且应该没有办法从这样的查询中获取数据。因为在评估 table.
中的所有数据之前,您不知道有多少列
您可以使用程序 p_pivot,代码如下。它会根据您的 table 动态构建视图 v_test。
然后你可以select从这个视图像这里:
Connected to Oracle Database 10g Release 10.2.0.4.0
SQL> execute p_pivot;
PL/SQL procedure successfully completed
SQL> select * from v_test;
ID COD1 COD2 COD3
---------- ----- ----- -----
1 a b c
2 d e
3 f g
程序(请在代码中将 table 名称从 test
更改为您的 table 名称:
create or replace procedure p_pivot is
v_cols number;
v_sql varchar2(4000);
begin
select max(cnt) into v_cols
from (select count(1) cnt from test group by id);
v_sql :=
'create or replace view v_test as
with t as (select row_number() over (partition by id order by cod) rn, test.* from test)
select id';
for i in 1..v_cols
loop
v_sql := v_sql || ', max(decode(rn, '||i||', cod)) cod'||i;
end loop;
v_sql := v_sql || ' from t group by id';
execute immediate v_sql;
end p_pivot;
您好,您也可以使用此查询。
--创建测试数据
create table test_me(id_num number,val varchar2(10));
insert all
into test_me
values(1,'a')
into test_me values (1,'b')
into test_me values (1,'c')
into test_me values (2,'d')
into test_me values (2,'e')
into test_me values (3,'f')
into test_me values (3,'g')
select 1 from dual;
select * from
(
select id_num,val,row_number() over (partition by id_num order by val) rn
from test_me )
pivot (max(val) for id_num in(1 as val_1,2 as val_2,3 as val_3));
SQLFiddle 演示在这里
http://sqlfiddle.com/#!4/4206f/1
我有这样的东西:
id cod
1 a
1 b
1 c
2 d
2 e
3 f
3 g
我需要这样的东西:
id cod 1 cod 2 cod 3
1 a b c
2 d e
3 f g
您了解无法知道在执行时间之前 oracle 必须生成多少列。
没有办法做到这一点。 Oracle 在编译查询时必须知道列数。
假设您使用这样的查询创建了一个视图。每次查看时,该视图都会有不同数量的列。
而且应该没有办法从这样的查询中获取数据。因为在评估 table.
中的所有数据之前,您不知道有多少列您可以使用程序 p_pivot,代码如下。它会根据您的 table 动态构建视图 v_test。 然后你可以select从这个视图像这里:
Connected to Oracle Database 10g Release 10.2.0.4.0
SQL> execute p_pivot;
PL/SQL procedure successfully completed
SQL> select * from v_test;
ID COD1 COD2 COD3
---------- ----- ----- -----
1 a b c
2 d e
3 f g
程序(请在代码中将 table 名称从 test
更改为您的 table 名称:
create or replace procedure p_pivot is
v_cols number;
v_sql varchar2(4000);
begin
select max(cnt) into v_cols
from (select count(1) cnt from test group by id);
v_sql :=
'create or replace view v_test as
with t as (select row_number() over (partition by id order by cod) rn, test.* from test)
select id';
for i in 1..v_cols
loop
v_sql := v_sql || ', max(decode(rn, '||i||', cod)) cod'||i;
end loop;
v_sql := v_sql || ' from t group by id';
execute immediate v_sql;
end p_pivot;
您好,您也可以使用此查询。
--创建测试数据
create table test_me(id_num number,val varchar2(10));
insert all
into test_me
values(1,'a')
into test_me values (1,'b')
into test_me values (1,'c')
into test_me values (2,'d')
into test_me values (2,'e')
into test_me values (3,'f')
into test_me values (3,'g')
select 1 from dual;
select * from
(
select id_num,val,row_number() over (partition by id_num order by val) rn
from test_me )
pivot (max(val) for id_num in(1 as val_1,2 as val_2,3 as val_3));
SQLFiddle 演示在这里 http://sqlfiddle.com/#!4/4206f/1