我在表格中有以下数据
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 :(得分: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来创建行,填入空值,然后重复,直到所有三个堆栈都用完为止。
我希望你觉得这很有用。
答案 1 :(得分:0)
这是一个非常有趣的问题。你不是第一个。在这里查看最后7页(没有解决方案,但可能很有趣): http://wwwlgis.informatik.uni-kl.de/cms/fileadmin/courses/ws1112/Middleware/Vorlesung/EIS_Chapter_2_Virtual_Data_Integration.pdf