2013-04-30 3 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 критических пациентов с одинаковыми идентификаторами? –

+0

@AmitSingh Я думаю, что вы не прочитали вопрос и ожидаемый результат .. :) – BreakHead

+0

вы правы, я понял это сейчас –

ответ

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

+0

Вы можете добавить здесь 'для rnk в (1, 2, 3, 4, 5)'. Я объяснил вам в комментариях о том, что переменное количество столбцов не представляется возможным в простом sql. –

+0

, но может быть number_Of_Columns = number_Critical_Patients_Rows – BreakHead

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; 
Смежные вопросы