2013-04-30 41 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;