我有一个包含架构的表格,如下所示
Empid Field Type Field Value
123 Name John
123 Age 33
124 Name Tijo
124 Age 24
输出应采用以下格式
Empid Name Age
123 John 33
124 Tijo 24
如何使用oracle数据库中的查询实现此目的?
答案 0 :(得分:6)
这种类型的行转换为列称为PIVOT。有几种方法可以做到这一点。
由于您使用的是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';
见SQL Fiddle with Demo。每个版本都给出了结果:
| EMPID | NAME | AGE |
----------------------
| 123 | John | 33 |
| 124 | Tijo | 24 |
答案 1 :(得分:4)
听起来你正试图PIVOT
你的桌子。一种选择是将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