2012-05-10 58 views
2

我有一個數據庫表是這樣的:SQL:如何合併行分成單獨的行

id | check_number  | amount 
1 | 1001]1002]1003  | 200]300]100 
2 | 2001]2002   | 500]1000 
3 | 3002]3004]3005]3007 | 100]300]600]200 

我想記錄分成是這樣的:

id | check_number | amount 
1 | 1001   | 200 
2 | 1002   | 300 
3 | 1003   | 100 
. |  .    | . 
. |  .    | . 
. |  .    | . 

我該怎麼辦這只是在Oracle和SQL Server中使用SQL?

感謝,

米洛

+2

你想用'id'列做什麼?爲轉換後的數據集生成一個新值? – Phil

+1

'sql-server'或'oracle'?或者你在兩個RDBMS上真的有這個問題嗎? – MatBailie

+1

什麼是數據的來源?在將數據加載到數據庫之前,您是否可以選擇重新格式化數據? –

回答

2

在Oracle僅使用CONNECT BY水平的方法(見here),有幾個注意事項:

select rownum, id, 
     substr(']'||check_number||']' 
       ,instr(']'||check_number||']',']',1,level)+1 
       ,instr(']'||check_number||']',']',1,level+1) 
       - instr(']'||check_number||']',']',1,level) - 1) C1VALUE, 
     substr(']'||amount||']' 
       ,instr(']'||amount||']',']',1,level)+1 
       ,instr(']'||amount||']',']',1,level+1) 
       - instr(']'||amount||']',']',1,level) - 1) C2VALUE 
    from table 
connect by id = prior id and prior dbms_random.value is not null 
     and level <= length(check_number) - length(replace(check_number,']')) + 1 


ROWNUM ID C1VALUE C2VALUE 

1  1 1001 200 
2  1 1002 300 
3  1 1003 100 
4  2 2001 500 
5  2 2002 1000 
6  3 3002 100 
7  3 3004 300 
8  3 3005 600 
9  3 3007 200 

本質上講,我們吹熄使用分層查詢函數,然後只獲取check_number和amount列中每個「列」數據中的數據的子字符串。

主要的警告:數據被轉化必須有相同數量的兩列「數據元素」的,因爲我們使用的首列「計數」進行改造的項目數。

我已經在11gR2上測試過了。 YMMV也取決於DMBS版本。請注意需要使用「PRIOR」運算符,它可以防止oracle進入循環的無限連接。

+0

編輯 - 通過連接沒有check_number。查詢應該現在運行。 –

+1

在SQL Server中,可以使用遞歸CTE進行類似的操作。 –