2017-09-26 54 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