Условная замена NULL - PullRequest
       1

Условная замена NULL

0 голосов
/ 28 мая 2020

У меня есть таблица со многими столбцами: (в предыдущем посте был только один идентификатор на один идентификатор источника, но в этом случае более одного идентификатора на один идентификатор источника)

id    col1             source_id
a1    765.3            a5
a2    3298.3           a4
a3    8762.1           a8
a4    3298.3           (null)      
a5    (null)           a6
a6    (null)           (null)
a7    10               a5       

Я хочу заполнить null values of source _id с values from id. Например, source_id a5 row has null, который нужно заменить на id a1 + id a7 values, впоследствии source_id a6 row having null нужно заменить на a5 row

Вывод:

id    col1             source_id
a1    765.3            a5
a2    3298.3           a4
a3    8762.1           a8
a4    3298.3           (null)      
a5    765.3+10=775.3   a6
a6    765.3+10=775.3   (null)
a7    10               a5 

Спасибо !!

РЕДАКТИРОВАТЬ :

Чтобы было понятнее, необходимо заполнить нулевые значения в столбцах, кроме source_id и id. Учитывая только col1 для упрощенного сообщения, столбцов тоже может быть много

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Используйте коррелированный иерархический запрос (вы можете коррелировать либо по столбцу id, либо по псевдостолбцу ROWID):

SELECT id,
       COALESCE(
         col1,
         (
           SELECT SUM( COALESCE( col1, 0 ) )
           FROM   table_name s
           START WITH s.ROWID = t.ROWID
           CONNECT BY source_id = PRIOR id
         )
       ) AS col1,
       source_id
FROM   table_name t;

Итак, для ваших данных образца:

CREATE TABLE table_name ( id, col1, source_id ) AS
SELECT 'a1',  765.3, 'a5' FROM DUAL UNION ALL
SELECT 'a2', 3298.3, 'a4' FROM DUAL UNION ALL
SELECT 'a3', 8762.1, 'a8' FROM DUAL UNION ALL
SELECT 'a4', 3298.3, null FROM DUAL UNION ALL
SELECT 'a5',   null, 'a6' FROM DUAL UNION ALL
SELECT 'a6',   null, null FROM DUAL UNION ALL
SELECT 'a7',     10, 'a5' FROM DUAL;

Это выводит:

ID |   COL1 | SOURCE_ID
:- | -----: | :--------
a1 |  765.3 | a5       
a2 | 3298.3 | a4       
a3 | 8762.1 | a8       
a4 | 3298.3 | <em>null</em>     
a5 |  775.3 | a6       
a6 |  775.3 | <em>null</em>     
a7 |     10 | a5       

Вам может потребоваться прекратить итерацию, когда вы найдете первое ненулевое значение в каждой ветви иерархии. Для этого просто потребуется добавить простой фильтр:

SELECT id,
       COALESCE(
         col1,
         (
           SELECT SUM( COALESCE( col1, 0 ) )
           FROM   table_name s
           START WITH s.ROWID = t.ROWID
           CONNECT BY source_id = PRIOR id
                  AND PRIOR col1 IS NULL
         )
       ) AS col1,
       source_id
FROM   table_name t;

(результат такой же, как и выше).

db <> fiddle здесь

0 голосов
/ 28 мая 2020

При следующем выборе вы получите те строки, которые имеют ссылку в столбце source_id и значение в столбце col1.

select id 
       , case when col1 is null then
              (select sum(col1) from test tt where tt.sourceid = t.id)
         else
              col1
         end result
       , sourceid
from test t     
order by id;

вот демо

Это вариант для полного решения:

with cte as (select t.id 
       , case when t.col1 is null then
              (select sum(tt.col1) from test tt where tt.sourceid = t.id)
         else
              t.col1
         end result
       , t.sourceid
from test t     
order by id)
select t.id 
       , 
          case when t.result is null then
              (select sum(tt.result) from cte tt where tt.sourceid = t.id)
         else
              t.result
         end result
       , t.sourceid
from cte t     
order by id

вот демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...