我已經在一個表中以下數據數據轉換
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一個通行證。
我已經在一個表中以下數據數據轉換
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一個通行證。
您可以使用以下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來創建行,用空值填充並重復,直到所有三個堆棧都耗盡。
我希望你覺得這有幫助。
這是一個非常有趣的問題。你不是第一個。看到最後7頁在這裏(沒有解決您的問題,但也許有趣): http://wwwlgis.informatik.uni-kl.de/cms/fileadmin/courses/ws1112/Middleware/Vorlesung/EIS_Chapter_2_Virtual_Data_Integration.pdf
你有一個主鍵在該表?你想修改表格上的數據(如更新+刪除)還是簡單地選擇它? – xanatos 2012-03-16 14:19:19
@ASolvent:爲什麼B和C在與A相同的行上返回,但不是G或H?是否有另一列(未顯示)確定這一點? – 2012-03-16 14:22:19
OMG-我之前有過類似的情況,但之後數據是100(s),所以我將數據發送到前端並輕鬆地在那裏操作。我可以用遊標來完成。 – asolvent 2012-03-16 14:22:36