2013-04-24 106 views
1

我有模式的表格如下列值到头甲骨文

Empid Field Type Field Value 
123   Name   John 
123   Age   33 
124   Name   Tijo 
124   Age   24 

输出应该在followinf格式

Empid  Name    Age 
123   John    33 
124   Tijo    24 

我怎样才能实现这种从Oracle数据库使用查询?

回答

2

听起来像你正在试图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

+0

@JijilPK - np,很高兴我们可以帮助! – sgeddes 2013-04-24 17:14:20

6

这种类型的行转变成列称为一个支点。有几种方法可以做到这一点。

由于使用的是Oracle 11g中,你可以使用旋转功能:

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 | 
+0

最后一种方法只适用于假设每个员工id的字段类型都存在“名称”(它与样本数据一起)。为最后一个选项引入第三次加入可能会更安全。虽然(一如既往)很好地使用PIVOT! – sgeddes 2013-04-24 17:00:51

+0

@sgeddes我认为每个记录都会有一个'name'。 :) – Taryn 2013-04-24 17:13:57

+0

可能是一个很好的假设:-) - +1的答案 – sgeddes 2013-04-24 17:15:28