Sql 用几个标准从Oracle表中推断结果

Sql 用几个标准从Oracle表中推断结果,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,这是一个艰难的过程。我读过关于从表中的多个行合并值的内容,但找不到任何关于如何执行我面前的任务集的内容。 我不是甲骨文人,直到现在我只做了简单的select查询,所以我在这里不知所措 在包含实验室结果的巨大oracle数据库表(severel数亿行)中,我需要选择满足特定条件的特定申请的信息 with req AS ( select reqno from t where ana IN ('A','B','C') GROUP BY reqno HAVING count(DI

这是一个艰难的过程。我读过关于从表中的多个行合并值的内容,但找不到任何关于如何执行我面前的任务集的内容。 我不是甲骨文人,直到现在我只做了简单的select查询,所以我在这里不知所措

在包含实验室结果的巨大oracle数据库表(severel数亿行)中,我需要选择满足特定条件的特定申请的信息

with req
AS
 (
   select reqno from t where ana IN ('A','B','C') 
    GROUP BY reqno HAVING
   count(DISTINCT  ana) = 3
 )
select * FROM
(
  select * from t where 
    exists ( select 1 from req r where t.reqno = r.reqno )
 )
    PIVOT(
          min(answer) for ana in ('A' as A, 'B' as B, 'C' as C,
                                  'X' as X, 'Y' as Y, 'Z' as Z)
           ) ORDER BY reqno;
标准:对于同一需求编号,分析A、B和C必须有答案,如果有,则应选择分析X、Y或Z答案的任何实例

附表内容:

ReqNo   Ana Answer
1       A   7
1       B   14
1       C   18
1       X   250
2       A   8
2       X   35
2       Y   125
3       A   8
3       B   16
3       C   20
3       Z   100
4       X   115
4       Y   355
5       A   6
5       B   15
5       C   22
5       X   300
5       Y   108
5       C   88
预期结果:

ReqNo   A   B   C   X   Y   Z
1      7    14  18  250     
3      8    16  20          100
5      6    15  22  300 108 88
遗漏需求2和需求4,因为它们不符合A/B/C标准

with req
AS
 (
   select reqno from t where ana IN ('A','B','C') 
    GROUP BY reqno HAVING
   count(DISTINCT  ana) = 3
 )
select * FROM
(
  select * from t where 
    exists ( select 1 from req r where t.reqno = r.reqno )
 )
    PIVOT(
          min(answer) for ana in ('A' as A, 'B' as B, 'C' as C,
                                  'X' as X, 'Y' as Y, 'Z' as Z)
           ) ORDER BY reqno;

这是可能的吗?

您可以首先筛选包含所有3个(A、B和C)的记录,然后使用
PIVOT
将它们转换为满足条件的列

with req
AS
 (
   select reqno from t where ana IN ('A','B','C') 
    GROUP BY reqno HAVING
   count(DISTINCT  ana) = 3
 )
select * FROM
(
  select * from t where 
    exists ( select 1 from req r where t.reqno = r.reqno )
 )
    PIVOT(
          min(answer) for ana in ('A' as A, 'B' as B, 'C' as C,
                                  'X' as X, 'Y' as Y, 'Z' as Z)
           ) ORDER BY reqno;

您可以首先筛选包含所有3个(A、B和C)的记录,然后使用
PIVOT
将它们转换为满足条件的列

with req
AS
 (
   select reqno from t where ana IN ('A','B','C') 
    GROUP BY reqno HAVING
   count(DISTINCT  ana) = 3
 )
select * FROM
(
  select * from t where 
    exists ( select 1 from req r where t.reqno = r.reqno )
 )
    PIVOT(
          min(answer) for ana in ('A' as A, 'B' as B, 'C' as C,
                                  'X' as X, 'Y' as Y, 'Z' as Z)
           ) ORDER BY reqno;

我只想使用条件聚合:

select reqno,
       max(case when Ana = 'A' then Answer end) as a,
       max(case when Ana = 'B' then Answer end) as b,
       max(case when Ana = 'C' then Answer end) as c,
       max(case when Ana = 'X' then Answer end) as x,
       max(case when Ana = 'Y' then Answer end) as y,
       max(case when Ana = 'Z' then Answer end) as z
from t
group by reqno
having sum(case when Ana = 'A' then 1 else 0 end) > 0 and
       sum(case when Ana = 'B' then 1 else 0 end) > 0 and
       sum(case when Ana = 'C' then 1 else 0 end) > 0 ;
考虑到您似乎没有重复项,您可以将
拥有
简化为:

having sum(case when Ana in ('A', 'B', 'C') then 1 else 0 end) = 3

我只想使用条件聚合:

select reqno,
       max(case when Ana = 'A' then Answer end) as a,
       max(case when Ana = 'B' then Answer end) as b,
       max(case when Ana = 'C' then Answer end) as c,
       max(case when Ana = 'X' then Answer end) as x,
       max(case when Ana = 'Y' then Answer end) as y,
       max(case when Ana = 'Z' then Answer end) as z
from t
group by reqno
having sum(case when Ana = 'A' then 1 else 0 end) > 0 and
       sum(case when Ana = 'B' then 1 else 0 end) > 0 and
       sum(case when Ana = 'C' then 1 else 0 end) > 0 ;
考虑到您似乎没有重复项,您可以将
拥有
简化为:

having sum(case when Ana in ('A', 'B', 'C') then 1 else 0 end) = 3