2013-08-29 62 views
-1

我有一個表像下面:如何將行更改爲列?

Name  Org 
aaaa  bbb 
aaaa  bbbb 
aaaa  bbbbb 
bbbb  cccc 

如何使用的Oracle SQL改變成下面的格式

Name Org1  Org2  Org3 
aaaa bbb  bbbb  bbbbb 
bbbb cccc 
+0

您使用的是哪個版本的Oracle?你打算每個名字都有一定數量的組織嗎? – Taryn

+0

Oracle 11是的。我認爲5是每個名稱可以有的最多組織數 – haoyun

回答

1

有,你可以得到結果的幾種方法。我顯示的兩個版本都使用row_number()來幫助將行轉換爲列。

可以使用聚合函數CASE表達式:

select 
    name, 
    max(case when seq = 1 then org end) org1, 
    max(case when seq = 2 then org end) org2, 
    max(case when seq = 3 then org end) org3, 
    max(case when seq = 4 then org end) org4, 
    max(case when seq = 5 then org end) org5 
from 
(
    select name, org, 
    row_number() over(partition by name 
         order by org) seq 
    from yourtable 
) d 
group by name; 

SQL Fiddle with Demo。或者,因爲你使用的是Oracle 11g中,你可以使用旋轉功能對行轉換爲列:

select name, 
    Org1, 
    Org2, 
    Org3, 
    Org4, 
    Org5 
from 
(
    select name, org, 
    row_number() over(partition by name 
         order by org) seq 
    from yourtable 
) d 
pivot 
(
    max(org) 
    for seq in ('1' as Org1, '2' as Org2, 
       '3' as Org3, '4' as Org4, 
       '5' as Org5) 
) piv 

SQL Fiddle with Demo。兩者都給出結果:

| NAME | ORG1 | ORG2 | ORG3 | ORG4 | ORG5 | 
| aaaa | bbb | bbbb | bbbbb | (null) | (null) | 
| bbbb | cccc | (null) | (null) | (null) | (null) | 
+0

非常感謝 – haoyun

0

您可以使用PIVOT來實現這一目標。

喜歡的東西this: -

select * 
from 
    (select fk_department 
    from employee) 
    pivot 
    (count(fk_department) 
     for fk_department in ('INT', 'WEL', 'CEN', 'POL')); 
+0

我不知道aaaa有多少部門。 ('INT','WEL','CEN','POL'))中的fk_department中應該使用什麼?非常感謝你! – haoyun

+0

這只是一個不是您必須使用的實際查詢的示例。這個解釋在我分享的鏈接中解釋! –