Sql 将列值添加到oracle标头

Sql 将列值添加到oracle标头,sql,oracle,oracle11g,pivot,Sql,Oracle,Oracle11g,Pivot,我有一个带有模式的表,如下所示 Empid Field Type Field Value 123 Name John 123 Age 33 124 Name Tijo 124 Age 24 输出应为以下INF格式 Empid Name Age 123 John 33 12

我有一个带有模式的表,如下所示

Empid   Field Type  Field Value
123         Name          John
123         Age            33
124         Name          Tijo
124         Age            24
输出应为以下INF格式

Empid       Name             Age
123         John             33
124         Tijo             24

如何使用oracle数据库中的查询来实现此功能?

听起来您正试图
透视表。一个选项是将
MAX
CASE
一起使用:

select empid,
   max(case when fieldtype = 'Name' then fieldvalue end) Name,
   max(case when fieldtype = 'Age' then fieldvalue end) Age
from yourtable
group by empid

这种从行到列的转换称为轴。有几种方法可以做到这一点

由于您使用的是Oracle 11g,因此可以使用PIVOT功能:

select empid, Name, age
from
(
  select empid,
    fieldtype,
    fieldvalue
  from yt
) 
pivot
(
  max(fieldvalue)
  for fieldtype in ('Name' as Name, 'Age' as Age)
);

在Oracle 11g之前,您可以将聚合函数与
CASE
表达式一起使用:

select empid,
  max(case when fieldtype = 'Name' then fieldvalue end) name,
  max(case when fieldtype = 'Age' then fieldvalue end) age
from yt
group by empid;

您还可以通过多次在表上连接来获得结果:

select t1.empid,
  t1.fieldvalue name,
  t2.fieldvalue age
from yt t1
left join yt t2
  on t1.empid = t2.empid
  and t2.fieldtype = 'Age'
where t1.fieldtype = 'Name';
看。每个版本都给出了结果:

| EMPID | NAME | AGE |
----------------------
|   123 | John |  33 |
|   124 | Tijo |  24 |

最后一种方法仅在假设每个员工id的字段类型中都存在“Name”的情况下才有效(它与示例数据相关)。为最后一个选项引入第三个联接可能更安全。不过,PIVOT的使用很好(一如既往)@sgedes我假设每条记录都有一个
名称
:)@JijilPK--np,很高兴我们能帮忙!