2013-04-30 38 views
0
Table Schema 

ID Status  Patient 
1  critical Gabriel 
1  moderate Frank 
1  critical Dorin 
2  low  Peter 
3  critical Noman 
3  moderate Johnson 

預期輸出多行的一行的多個列coulmns


ID Patient1 Patient2 
1 Gabriel Dorin 
3 Noman  Null 

這裏我只顯示那些病人,其情況是critcal。

我發現了類似的問題Multiple column values in a single row,但它在SQL中的列也是硬編碼的。

謝謝!

+1

如果你有3名危重病人在同一個ID,會發生什麼被插入到光標? – 2013-04-30 11:06:23

+0

@AmitSingh我認爲你沒有看到這個問題,並預期的結果.. :) – BreakHead 2013-04-30 11:08:13

+0

你是對的,我現在得到它 – 2013-04-30 11:11:56

回答

3

第一步是選擇危重病人,並命令他們:

select id, patient, row_number() over (partition by id order by patient) as rnk 
from your_table 
where status='critical'; 

此之後,你可以用這種方式選擇前兩個危重病人:

select id, 
     max(case when rnk=1 then patient end) as Patient1, 
     max(case when rnk=2 then patient end) as Patient2 
from (
    select id, 
      patient, 
      row_number() over (partition by id order by patient) as rnk 
    from your_table 
    where status='critical' 
) 
group by id; 

如果你想有一個更靈活的解決方案你可以嘗試像下面這樣的查詢,但是你應該在運行前選擇排名數:

with your_table as 
(select 1 as id,  'critical' as status, 'Gabriel' as patient from dual 
union all 
select 1,  'moderate', 'Frank' from dual union all 
select 1,  'critical', 'Dorin' from dual union all 
select 1,  'critical', 'Vasile' from dual union all 
select 2,  'low',  'Peter' from dual union all 
select 3,  'critical', 'Noman' from dual union all 
select 3,  'moderate', 'Johnson' from dual) 

select * from (
    select id, patient, row_number() over (partition by id order by patient) as rnk 
    from your_table 
    where status='critical' 
    ) 
pivot (max(patient) for rnk in (1, 2, 3)) 
order by 1 ; 

(這是針對三位患者的)

+0

什麼時候患者的人數更多? – BreakHead 2013-04-30 11:47:45

+0

你可以在這裏添加'(1,2,3,4,5)'。我在問題的評論中解釋了可變數量的列在普通的sql中不可用。 – 2013-04-30 11:57:14

+0

,但可以是number_Of_Columns = number_Critical_Patients_Rows – BreakHead 2013-04-30 12:00:27

0

嘗試構建查詢並將結果執行到遊標。

SET SERVEROUTPUT ON 

DECLARE 
v_fact NUMBER := 1; 
v_max_cnt number:=1; 
V_query CLOB:=''; 
BEGIN 
select max(RNum) into v_max_cnt from(
    select row_number() over (partition by ID order by ID) RNum from PATIENTSTATUS where status='critical' 
)x; 
FOR v_counter IN 1..v_max_cnt LOOP 
    V_query := V_query||v_fact||' as Patient'||v_fact||(case when v_fact=v_max_cnt then '' else ',' end); 
    v_fact:=v_fact+1; 
    END LOOP; 

    DBMS_OUTPUT.PUT_LINE ('select * from (
    select id, patient, row_number() over (partition by id order by patient) as rnk 
    from PATIENTSTATUS 
    where status=''critical'') 
    pivot (max(patient) for rnk in ('||V_query||')) 
    order by 1;'); 
END; 

從一個過程中,數據可以通過

OPEN CUR_Your_Cursor FOR V_query;