我已经在一个表中以下数据数据转换
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