Мне не совсем ясно, чего вы хотите достичь.
Но для начала ваш существующий запрос может быть упрощен до:
select count(*) as total_rows,
count(*) - count(column1) as missing_column1,
count(*) - count(column2) as missing_column2,
count(*) - count(column3) as missing_column3,
count(*) - count(column3) as missing_column4
from table_name
Если вы беспокоитесь: count(*)
будет оцениваться только один раз, а не пять раз.
Если вы хотите, чтобы числа для каждого столбца представляли собой строки («длинный формат»?), А не столбцы («широкоформатный»), можно отменить результат из приведенного выше:
with totals as (
select count(*) as total_rows,
count(*) - count(column1) as missing_column1,
count(*) - count(column2) as missing_column2,
count(*) - count(column3) as missing_column3,
count(*) - count(column3) as missing_column4
from table_name
)
select t.total_rows, m.col_name, m.num_missing
from totals t
cross join lateral (
values ('column1', missing_column1),
('column2', missing_column2),
('column3', missing_column3),
('column4', missing_column4)
) as m(col_name, missing);