数据转换

时间:2012-03-16 14:10:22

标签: sql oracle transformation

我在表格中有以下数据


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一个通行证。

2 个答案:

答案 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