根据表中每行的列值设置列值

时间:2014-03-28 01:33:55

标签: oracle plsql oracle11g plsqldeveloper

我想为表中的每一行搜索特定的列值。值可以是“A”,“B”或null。如果在任何行中找到值“A”,我想将该值分配给列。如果该值不存在,我想显示现有的列值。

这就是我想要完成的事情。

record_id     Event_Type
1                A
1                B
1                null
2                B
2                null
3                B
3                A

尝试返回以下结果

record id      Event_Type
1                A
2                B
3                A

2 个答案:

答案 0 :(得分:1)

通过SQLFiddle

create table t1 (record_id number, event_type char(1));

insert into t1 values (1, 'A');
insert into t1 values (1, 'B');
insert into t1 values (1, NULL);
insert into t1 values (2, 'B');
insert into t1 values (2, NULL);
insert into t1 values (3, 'A');
insert into t1 values (3, 'B');

SELECT DISTINCT RECORD_ID, 
       MIN(EVENT_TYPE) OVER (PARTITION BY RECORD_ID ORDER BY EVENT_TYPE NULLS LAST) as event_type
  FROM T1
 ORDER BY RECORD_ID;

答案 1 :(得分:0)

事实证明,您可以使用min()

执行您想要的操作
select recordid, min(Event_Type) as Event_Type
from table t
group by recordid;

但是,这更是巧合。这是一种即使A不按字母顺序排在第一位的方法,也可以使用

select recordid,
       (case when sum(case when Event_Type = 'A' then 1 else 0 end) > 0
             then 'A'
             else max(Event_Type)
        end) as Event_Type
from table t
group by recordid;