2013-04-24 83 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