Oracle: как считать нулевые и ненулевые строки - PullRequest
21 голосов
/ 01 апреля 2011

У меня есть таблица с двумя столбцами, которые могут быть null (а также некоторые другие столбцы). Я хотел бы посчитать, сколько строк имеют столбцы a, b, оба и ни один из столбцов, для которых установлено значение null.

Возможно ли это с Oracle в одном запросе? Или мне нужно создать один запрос для каждого? Не можете использовать group by или другие вещи, о которых я, возможно, не знаю, например?

Ответы [ 6 ]

46 голосов
/ 01 апреля 2011

COUNT(expr) будет подсчитывать количество строк, где expr не равно нулю, таким образом, вы можете подсчитать количество нулей с помощью выражений, подобных этим:

SELECT count(a) nb_a_not_null,
       count(b) nb_b_not_null,
       count(*) - count(a) nb_a_null,
       count(*) - count(b) nb_b_null,
       count(case when a is not null and b is not null then 1 end)nb_a_b_not_null
       count(case when a is null and b is null then 1 end) nb_a_and_b_null
  FROM my_table
8 голосов
/ 01 апреля 2011

Примерно так:

SELECT sum(case 
               when a is null and b is null then 1
               else 0
           end) as both_null_count,
       sum(case
               when a is null and b is not null then 1
               else 0
           end) as only_a_is_null_count
FROM your_table

Вы можете расширить это для других комбинаций нуль / не ноль

3 голосов
/ 01 апреля 2011
select sum(decode(a,null,0,1)) as "NotNullCount", sum(decode(a,null,1,0)) as "NullCount"
from myTable;

Повторите для любого количества полей.

0 голосов
/ 06 февраля 2014

Это может быть выполнено в Oracle только в 1 строке:

SELECT COUNT(NVL(potential_null_column, 0)) FROM table;

Функция NVL проверяет, является ли первый аргумент нулевым, и обрабатывает его как значение из второго аргумента.

0 голосов
/ 30 августа 2013

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

SELECT (sum(case 
           when trim(a) is null Then 1
           else 0
       end)) +
   (sum(case
           when trim(b) is null 
           else 0
       end)) +
   (sum(case
           when trim(c) is null 
           else 0
       end)) as NullCount
FROM your_table

Надеюсь, это поможет

Приветствия.

0 голосов
/ 01 апреля 2011

Один из способов сделать это будет:

select count(*) from table group by nvl2(a, 0, 1), nvl2(b, 0, 1) having nvl2(a,0,1) = nvl2(b,0,1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...