将表从列方式转换为行格式

时间:2017-05-17 22:00:21

标签: sql oracle plsql

我有一张如下表格:

entity field_1 field_2 field_3
1      A 
2              B
3              E       C

我必须将表格转换为以下结构:

entity param_id     param_value
1      paramId_1    A
2      paramId_2    B
3      ParamId_2    E
3      ParamId_3    C

如果观察表格,将根据第一个表格中的数据形成第二个表格。表1中的每个实体有3列。因此,表2最多可以包含3个行,最多只能包含1个实体。行数取决于第一个表中存在的非空值。

那么如何在Oracle中实现这一目标?我尝试在谷歌搜索,但找不到任何线索。

2 个答案:

答案 0 :(得分:1)

这是unpivot的直接应用。在此操作期间将忽略null个值。

select entity,case when field='FIELD_1' then 'paramID_1' 
                   when field='FIELD_2' then 'paramID_2' 
                   when field='FIELD_3' then 'paramID_3' 
              end as param_id,
param_value              
from t
unpivot (param_value for field in (field_1,field_2,field_3)) u

答案 1 :(得分:0)

你也可以使用union all来实现同样的目的。

SELECT e.entity
     , e.param_id
     , param_value = e.field_1

FROM dbo.entity (NOLOCK) e 

UNION ALL 

SELECT e1.entity
     , e1.param_id
     , param_value = e1.field_2

FROM dbo.entity (NOLOCK) e1 

UNION ALL 

SELECT e2.entity
     , e2.param_id
     , param_value = e2.field_3

FROM dbo.entity (NOLOCK) e2