2012-03-16 62 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来创建行,用空值填充并重复,直到所有三个堆栈都耗尽。

我希望你觉得这有帮助。