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