2017-09-26 28 views
0

请考虑此表:转换列中的Oracle SQL来排

表1

NUMBER  NAME  
---------------------- 
01    A    
01    B   
02    A   
01    C   
02    C 
03    C 
04    C 

我想将其转换为

表2

NAME NUM01 NUM02 NUM03 NUM04 NUM05 
-------------------------------------------------- 
A  01  02  NULL NULL NULL 
B  01  NULL NULL NULL NULL 
C  01  02  03  04  NULL 

表2,列数固定为(NUM01->05)。如果NAME值的值超过5个NUMBER值,则只选择前5位。如果它的值小于5,则在剩余列中填写NULL

我在NAME列中有很多不同的值,所以我想不出合适的方法来转换表1对吧。

请帮帮我。

+0

到目前为止您尝试了什么? – RealCheeseLord

回答

1

你的“编号”值显示为字符串,你不能有一个名为number除非你使用带引号的标识符列,所以我取代value创建示例数据:

create table table1(value varchar2(7), name varchar2(4)); 
insert into table1 (value, name) 
select '01', 'A' from dual 
union all select '01', 'B' from dual 
union all select '02', 'A' from dual 
union all select '01', 'C' from dual 
union all select '02', 'C' from dual 
union all select '03', 'C' from dual 
union all select '04', 'C' from dual 
/

您可以使用分析功能来分配行号或排名,以每个值:

select name, value, 
    row_number() over (partition by name order by value) as rn 
from table1; 

NAME VALUE   RN 
---- ------- ---------- 
A 01    1 
A 02    2 
B 01    1 
C 01    1 
C 02    2 
C 03    3 
C 04    4 

然后你就可以pivot that query(只要你在11g或更高),以获得结果你想要的:

select * 
from (
    select name, value, 
    row_number() over (partition by name order by value) as rn 
    from table1 
) 
pivot (max(value) as value for (rn) in (1, 2, 3, 4, 5)); 

NAME 1_VALUE 2_VALUE 3_VALUE 4_VALUE 5_VALUE 
---- ------- ------- ------- ------- ------- 
A 01  02        
B 01          
C 01  02  03  04    

排序高于5的任何内容都被pivot操作忽略。

+0

优秀的答案!正是我需要的,非常感谢你! – ShiroNek0