列值为oracle的标题

时间:2013-04-24 16:45:46

标签: sql oracle oracle11g pivot

我有一个包含架构的表格,如下所示

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数据库中的查询实现此目的?

2 个答案:

答案 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)
);

请参阅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 |

答案 1 :(得分:4)

听起来你正试图PIVOT你的桌子。一种选择是将MAXCASE

一起使用
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

SQL Fiddle Demo