我如何根据其他值选择值

时间:2018-08-09 13:41:30

标签: oracle

我有一张表,其数据如下所示

no  s   d
100 I   D
100 C   D
101 C   null
101 I   null
102 C   D
102 I   null

然后我正在使用此查询进行分区

create table pinky nologging as
select no,status,dead
from(select  no,status,dead,
    row_number() over(partition by no order by dead desc) seq
  from PINK) d
where seq = 1;

我得到了这个结果

100 I   D
101 C   null
102 I   null

但是我想要如下所示的数据

100 C D
101 I NULL
102 I NULL

  1. 对于I和C组合,两个d列均为D,然后选择C
  2. 对于I和C组合,并且两个d列均为空,然后选择I
  3. 对于I AND C COMBINATION,d列为空AND d然后选择空的对应值

1 个答案:

答案 0 :(得分:0)

假设每个dead is null只能有一个no记录:

with 
    -- you data, remove it when running the query 
    -- in your environment ...
    pink (no, status, dead) as 
        (select  100, 'I',  'D'  from dual union 
         select  100, 'C',  'D'  from dual union
         select  101, 'C', null  from dual union
         select  101, 'I', null  from dual union
         select  102, 'C',  'D'  from dual union
         select  102, 'I', null  from dual 
    ), 
    -- ... end of you data 
    --
    temp as (   -- a temporary table (CTE) where we make some 
                -- preliminary calculations
        select  pink.*, 
                -- count rows with status = 'I' for this no
                sum(case when status = 'I' then 1 else 0 end) over(partition by no) ni,
                -- count rows with status = 'C' for this no
                sum(case when status = 'C' then 1 else 0 end) over(partition by no) nc,
                -- count rows with dead = 'D' for this no
                sum(case when dead   = 'D' then 1 else 0 end) over(partition by no) nd,
                -- total number of rows (in case it's not always = 2)
                count(*) over(partition by no) n
        from    pink
    )
select  no, status, dead 
from    temp    
where   -- pick 'C' if there's also 'I' and all dead = 'D'
        status = 'C' and ni > 0 and nd = n
        -- pick 'I' if there's also 'C' and all dead is null
   or   status = 'I' and nc > 0 and nd = 0
        -- pick dead is null if there are I's and C's and 
        -- all other dead's = 'D' 
   or   dead is null and ni > 0 and nc > 0 and n - nd = 1;