2012-03-16 101 views
0

我已經在一個表中以下數據數據轉換

 

ID  Field1  Field2 Field3 
1  A 
1     B 
1       C 
2     D 
2       E 
2  F 
1  G 
1  H 

我想在下面

 

ID  Field1  Field2 Field3 
1  A   B   C 
1  G 
1  H 
2  F   D   E 

改造正是這個動作,可以使用SQL來完成,或者我已經去PL/SQL? 我期望的數據將以百萬爲單位,因此我想給CROSS JOIN一個通行證。

+0

你有一個主鍵在該表?你想修改表格上的數據(如更新+刪除)還是簡單地選擇它? – xanatos 2012-03-16 14:19:19

+3

@ASolvent:爲什麼B和C在與A相同的行上返回,但不是G或H?是否有另一列(未顯示)確定這一點? – 2012-03-16 14:22:19

+0

OMG-我之前有過類似的情況,但之後數據是100(s),所以我將數據發送到前端並輕鬆地在那裏操作。我可以用遊標來完成。 – asolvent 2012-03-16 14:22:36

回答

1

您可以使用以下select語句來聚合某些行。

select ID, min(Field1) Field1, min(Field2) Field2, min(Field3) Field3 
    from your_table 
    group by ID 
    -- Ignore rows where this would lose data 
    having nvl(count(Field1),0) < 2 
     and nvl(count(Field2),0) < 2 
     and nvl(count(Field3),0) < 2 

當我在測試數據上運行它時,我得到以下結果。

ID FIELD1 FIELD2 FIELD3 
----- ------ ------ ------ 
    2 F  D  E 

你可以通過這個在PL/SQL循環,與ID刪除所有行,並插入一個一行與此數據。

也許你可以使用first_value函數進行第二遍。

我的直覺表明這個表格可能沒有正確標準化。也許你應該有一個單獨的表。它看起來像這樣查詢的結果:

select id, 'Field1' field_id, Field1 field_value 
    from your_table 
    where field1 is not null 
union 
select id, 'Field2' field_id, Field2 field_value 
    from your_table 
    where field2 is not null 
union 
select id, 'Field3' field_id, Field3 field_value 
    from your_table 
    where field3 is not null 
order by 1, 2, 3 
/

    ID FIELD_ F 
---- ------ - 
    1 Field1 A 
    1 Field1 G 
    1 Field1 H 
    1 Field2 B 
    1 Field3 C 
    2 Field1 F 
    2 Field2 D 
    2 Field3 E 

如果不能重新歸一化你的表,你可以通過PL/SQL中的相同(標準化)查詢嘗試循環。您將爲每個字段設置堆棧併爲每行推送值。當ID改變時,您將通過彈出每個堆棧中的字段1,2和3來創建行,用空值填充並重復,直到所有三個堆棧都耗盡。

我希望你覺得這有幫助。