Подсчет нулевых значений в определенной строке - PullRequest
0 голосов
/ 04 марта 2019

У меня есть таблица, которая выглядит следующим образом

Indiv_id     Trip_band    Fav1    Fav2    Fav3    Fav4    Fav5  
1234    0-90    386568    null    null    null    568889  
5678    91-180    null    889546    887456    856234   null

Я хотел бы добавить еще один столбец, который подсчитывает количество нулевых значений в конкретной строке, и мой вывод будет выглядеть так:

Indiv_id     Trip_band    Fav1    Fav2    Fav3    Fav4    Fav5    null_count  
1234    0-90    386568    null    null    null    568889    3  
5678    91-180    null    889546    887456    856234    null    2  

Можно ли этого достичь?

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Вы можете сложить результат нескольких выражений регистра, по одному на каждый столбец, который вы хотите проверить:

-- CTE for sample data
with your_table (Indiv_id, Trip_band, Fav1, Fav2, Fav3, Fav4, Fav5  ) as (
  select 1234, '0-90', 386568, null, null, null, 568889 from dual
  union all
  select 5678, '91-180', null, 889546, 887456, 856234, null from dual
)
-- actual query
select t.*,
    case when fav1 is null then 1 else 0 end
  + case when fav2 is null then 1 else 0 end
  + case when fav3 is null then 1 else 0 end
  + case when fav4 is null then 1 else 0 end
  + case when fav5 is null then 1 else 0 end
  as null_count
from your_table t;

  INDIV_ID TRIP_B       FAV1       FAV2       FAV3       FAV4       FAV5 NULL_COUNT
---------- ------ ---------- ---------- ---------- ---------- ---------- ----------
      1234 0-90       386568                                      568889          3
      5678 91-180                889546     887456     856234                     2

или можете использовать специфичную для Oracle nvl2() функцию :

select t.*,
    nvl2(fav1, 0, 1)
  + nvl2(fav2, 0, 1)
  + nvl2(fav3, 0, 1)
  + nvl2(fav4, 0, 1)
  + nvl2(fav5, 0, 1)
  as null_count
from your_table t;

  INDIV_ID TRIP_B       FAV1       FAV2       FAV3       FAV4       FAV5 NULL_COUNT
---------- ------ ---------- ---------- ---------- ---------- ---------- ----------
      1234 0-90       386568                                      568889          3
      5678 91-180                889546     887456     856234                     2

, но выражения падежа мне понятнее.

Нет встроенной функции, которую можно было бы применить ко всем столбцам в строке одновременно, хотя вам необходимопроверьте их все индивидуально.(Полагаю, вы могли бы отменить, посчитать и повернуть назад - но это большая дополнительная работа, и вам все равно нужно перечислить столбцы ...)

0 голосов
/ 04 марта 2019

В Oracle 12C + вы можете использовать боковое соединение:

select x.*, c.cnt
from t cross join lateral
     (select count(*) as cnt
      from (select x.fav1 as fav from dual union all
            select x.fav2 from dual union all
            select x.fav3 from dual union all
            select x.fav4 from dual union all
            select x.fav5 from dual union all
           ) x
      where fav is not null
     ) c;
0 голосов
/ 04 марта 2019

вы можете попробовать, как показано ниже, используя регистр

 select t.*, 
        case when t.col1 is null then 1 
                                 else 0 end 
        + case when t.col2 is null then 1 else 0 end 
        + ........ 
        + case when coln is null then 1 else 0 end as null_count
   from table t

, поэтому вам нужно использовать все названия столбцов, как верхний описательный способ

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