这种将行转换为列的类型称为 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)
);
请参阅SQL Fiddle with Demo。
在 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;
请参阅SQL Fiddle with Demo。
您也可以通过多次加入表来获得结果:
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 |