SQL для замены NULL на основе другой выбранной строки - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть таблица T_REF, которая содержит следующие данные.

select * from T_REF
order by invent_status nulls first;

DIV  REF       INVENT_STATUS
---- --------- -------------
1    REF001XT  NULL
1    REF001XT  A

Как получить INVENT_STATUS как A для следующего.

  • Если второго ряда нет.
  • INVENT_STATUS - это что-то отличное от A для 2-го ряда.

SQL не должен изменять первый NULL, если вторая строка содержит A.

Так что в основном мне нужен SQL, который заменяет A на NULL, если в результате SQL.

нет A.

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Если я правильно понял, вам нужно это:

select div, ref, invent_status, 
       case when invent_status is null and 
                 count(case when invent_status = 'A' then 1 end) over () = 0 
            then 'A' 
            else invent_status 
       end as new_status
  from t_ref 
  order by invent_status nulls first;

демо

Условная аналитическая функция count(case when invent_status = 'A' then 1 end) over () проверяет, есть ли в вашей таблице A. Если нет и текущий статус равен нулю, то он заменяется на A.

0 голосов
/ 21 сентября 2018
select DIV, REF,
       case
           when (INVENT_STATUS is null) then 'A'
           when INVENT_STATUS = 'A' then null
           when INVENT_STATUS != 'A' then INVENT_STATUS
       else INVENT_STATUS
       end as INVENT_STATUS
from
    t_ref
order by INVENT_STATUS nulls first;
0 голосов
/ 14 сентября 2018

this is what i did see image

образец таблицы:

create table NS_11(
div int ,ref  varchar(10),INVENT_STATUS varchar(1));

insert into NS_11(div,ref) values(1,'REF001XT');
insert into NS_11 values(1,'REF002XT','A');
insert into NS_11 values(1,'REF003XT','B');
insert into NS_11 values(1,'REF004XT','C');
insert into NS_11(div,ref) values(1,'REF005XT');
insert into NS_11(div,ref) values(1,'REF006XT');
select * from  NS_11;

select div,ref,nvl(INVENT_STATUS,'A') from(select div,ref,INVENT_STATUS from NS_11 
minus select div,ref,INVENT_STATUS from NS_11  where rownum<=1 )
union all
select div,ref,INVENT_STATUS from NS_11 where rownum<=1;

образец вывода:

 1  REF002XT    A
 1  REF003XT    B
 1  REF004XT    C
 1  REF005XT    A
 1  REF006XT    A
 1  REF001XT    (null)

этот запрос будет работать для вашей таблицы:

select div,ref,INVENT_STATUS from T_REF where rownum<=1 
union
select div,ref,nvl(INVENT_STATUS,'A') from(select div,ref,INVENT_STATUS from T_REF 
minus select div,ref,INVENT_STATUS from T_REF  where rownum<=1 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...