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,很高兴我们能帮忙!