Если вы хотите, чтобы строки в выводе были в определенном порядке, вы должны включить этот порядок в операцию 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), но я считаю, что этот более подробный вариант легче понять.