Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 一行的多个列中有多行的列_Sql_Oracle - Fatal编程技术网

Sql 一行的多个列中有多行的列

Sql 一行的多个列中有多行的列,sql,oracle,Sql,Oracle,预期产量 在这里,我只展示那些情况危急的患者 我发现了类似的问题,但在SQL中,列也是硬编码的 谢谢 第一步是选择危重患者并对其进行排序: ID Patient1 Patient2 1 Gabriel Dorin 3 Noman Null 在此之后,您可以通过以下方式选择前两名危重患者: select id, patient, row_number() over (partition by id order by patient) as rnk from y

预期产量

在这里,我只展示那些情况危急的患者

我发现了类似的问题,但在SQL中,列也是硬编码的


谢谢

第一步是选择危重患者并对其进行排序:

ID   Patient1   Patient2
1    Gabriel    Dorin
3    Noman      Null
在此之后,您可以通过以下方式选择前两名危重患者:

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;

这是针对三名患者的。

第一步是选择危重患者并对其进行排序:

ID   Patient1   Patient2
1    Gabriel    Dorin
3    Noman      Null
在此之后,您可以通过以下方式选择前两名危重患者:

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  ;
从过程中,可以通过以下方式将数据插入光标:

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;

尝试构建查询并将结果执行到游标

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  ;
从过程中,可以通过以下方式将数据插入光标:

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;

如果你有3个同一身份证的危重病人会怎么样?@AmitSingh我想你没有读过这个问题,预期的结果是你说得对,我明白了now@FlorinGhita,则应相应地创建coulms,例如,有3名危重患者,应创建3个coulms,并在答案中添加一个枢轴解决方案。没有任何报表的列数为dinamic,可以在一个步骤中运行,也可以不进行编程。所以,你应该决定列数:如果你有3个相同id的危重病人,会发生什么?@AmitSingh我想你没有读过这个问题,预期结果是你说得对,我明白了now@FlorinGhita,则应相应地创建coulms,例如,有3名危重患者,应创建3个coulms,并在答案中添加一个枢轴解决方案。没有任何报表的列数为dinamic,可以在一个步骤中运行,也可以不进行编程。所以,您应该决定列的数量:当患者的数量更多时会发生什么?您可以在这里为rnk添加1、2、3、4、5。我在问题的评论中解释过,在普通sql中不可能有可变数量的列。但是可以是列的数量=关键患者的数量。这可以通过两个步骤编程完成。用于生成查询并执行第二个查询的查询:。但这不是sql。当患者数量更多时会发生什么?您可以在此处添加1、2、3、4、5中的rnk。我在问题的评论中解释过,在普通sql中不可能有可变数量的列。但是可以是列的数量=关键患者的数量。这可以通过两个步骤编程完成。用于生成查询并执行第二个查询的查询:。但这不是sql。