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

Sql 将表格从列格式转换为行格式,sql,oracle,plsql,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 如果观察这些表,第二个表将基于第一个表中的数

我有一张如下表:

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中实现这一点呢?我尝试在谷歌搜索,但找不到任何线索。

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

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

你也可以用一个联盟来实现同样的目标

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