отключить для всех столбцов, имеющих ноль - PullRequest
0 голосов
/ 12 ноября 2019

Мне нужны все столбцы из таблицы с количеством нулевых значений в каждом столбце с нулевым счетчиком.

У меня есть запрос типа

Select count(*)-count(COLA),count(*)-count(COLB),......count(*)-count(COLN) FROM TABLE;

Мне нужно количество для каждого столбца таблицы с нулевым значениемзначения от строки к столбцу.

COLUMN NAME - COUNT
COLA        - 0
COLB        - 2
.
.
.
COLN        - 7

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Если вы хотите, чтобы строки в выводе были в определенном порядке, вы должны включить этот порядок в операцию UNPIVOT. Это можно сделать с помощью оператора UNPIVOT или «по-старому» (как было выполнено отключение до того, как Oracle ввел оператор UNPIVOT), как показано ниже.

Рассмотрим стандартную таблицу EMP в схеме SCOTT. Имеет несколько столбцов. Предположим, что мы хотим показать нулевое число в столбцах EMPNO, ENAME, MGR и COMM, в этом порядке. Если вы изучите таблицу, то увидите, что в ней 14 строк. EMPNO является первичным ключом, поэтому в этом столбце нет нулей. ENAME НЕ NULL, поэтому, очевидно, в этом столбце также нет нулей. У MGR ровно один ноль (только у одного человека нет менеджера: президент компании). У COMM много нулей (точнее 10).

Вот как можно написать запрос:

select h.col, 
       sum(case h.col when 'EMPNO' then nvl2(e.empno, 0, 1)
                      when 'ENAME' then nvl2(e.ename, 0, 1)
                      when 'MGR'   then nvl2(e.mgr  , 0, 1)
                      when 'COMM'  then nvl2(e.comm , 0, 1)  end) as null_count
from   scott.emp e cross join 
       (select 'EMPNO' as col, 1 as ord from dual union all
        select 'ENAME'       , 2        from dual union all
        select 'MGR'         , 3        from dual union all
        select 'COMM'        , 4        from dual          ) h
group  by h.col, h.ord
order  by h.ord
;

COL   NULL_COUNT
----- ----------
EMPNO          0
ENAME          0
MGR            1
COMM          10

Строго говоря, жестко запрограммированный вспомогательный подзапрос, который я пометил h может иметь только столбец ORD (затем использовать соответствующие числа вместо имен столбцов в выражении CASE в предложении SELECT), но я считаю, что этот более подробный вариант легче понять.

0 голосов
/ 12 ноября 2019

Вы можете написать так:

Select * from
(
 Select count(*)-count(COLA) Cola_cnt,count(*)-count(COLB) colb_cnt,......count(*)-count(COLN)
From your_table
)
UNPIVOT
( YOUR_COUNT
  FOR col_name in
  (Cola_cnt, colb_cnt, ...)
);
...