2015-10-08 22 views
2

我下表多行一個行的Oracle SQL

P_ID, PROGR, DATA 
1 , 1 , 'DATO A' 
1 , 2 , 'DATO B' 
1 , 3 , 'DATO C' 
2 , 1 , 'DATO D' 
2 , 2 , 'DATO E' 
3 , 1 , 'DATO G' 

有,我希望得到這樣的結果

P_ID, DATA , DATA_1 , DATA_2 
1 , 'DATO A', 'DATO B', 'DATO C' 
2 , 'DATO D', 'DATO E', NULL 
3 , 'DATO G', NULL , NULL 

這個可以用左邊來完成與同桌一起,東西這樣的(不是精確的結果,但作爲一個例子)

select * from 
(select * from MYTABLE where PROGR = 1) a 
left join 
(select * from MYTABLE where PROGR = 2) b 
on a.P_ID = b.P_ID 
left join 
(select * from MYTABLE where PROGR = 3) c 
on a.P_ID = c.P_ID; 

的問題是,該查詢是固定的,並且需要重新如果某些P_ID得到PROGR = 4,則寫入。我認爲我需要創建一個過程,但我一直試圖沒有成功。

在此先感謝。

回答

3

可以使用條件彙總:

select t.pid, 
     max(case when t.progr = 1 then t.data end) as data_1, 
     max(case when t.progr = 2 then t.data end) as data_2, 
     max(case when t.progr = 3 then t.data end) as data_3 
from mytable t 
group by t.pid; 

要處理的變量數列,我能想到的三種解決方案:

  1. 投入足夠的列來處理你的數據(一些合理的最大)。
  2. 使用動態SQL(PL/SQL中的execute immediate)。
  3. 或者將它們合併爲一個列。

這裏是最後的辦法:下面的查詢

select t.pid, listagg(t.data, ', ') within group (order by t.progr) 
from mytable t 
group by t.pid; 
+0

這是一個很好的方法,但像最後一句話說,如果現在我有程序4在某一行,或然後程序會發生什麼5.可變數量的輸出列不是問題。 感謝您的回答,我學到了一些新東西。 – Martin

+0

動態SQL將是最好的。你可以給我一個例子嗎?。謝謝 – Martin

1

使用。

select p_id,max(data_1) as data_1,max(data_2)as data_2,max(data_3) as data_3 
    from 
    (select P_ID, 
    case when progr=1 then 
    data 
    end data_1, 
    case when progr=2 then 
    data 
    end data_2, 
    case when progr=3 then 
    data 
    end data_3 
    from thursday_check) 
    group by p_id