Измените набор результатов из широкой таблицы в длинную в postgres и улучшите запрос - PullRequest
0 голосов
/ 27 марта 2020

Я написал следующий запрос, чтобы получить количество пропущенных значений во всех столбцах таблицы. Но это возвращает набор результатов в широкой таблице форм:

1) Мне нужно изменить набор результатов в длинном формате.
2) Можно улучшить запрос, чтобы написать более простой?

Запрос:

-- Variable to save the row count from the table
WITH total_rows AS 
    (
    SELECT COUNT(*) AS rows
    FROM table_name
    )

-- Query to join subqueries (wide table format)
SELECT
    *
FROM

-- Subquery1
    (SELECT
        (SELECT rows FROM total_rows) - COUNT(colum1) AS missing_colum1 -- counts all values except nulls
    FROM table_name
    ) AS missing_values_colum1,

-- Subquery2    
    (SELECT
        (SELECT rows FROM total_rows) - COUNT(colum2) AS missing_colum2
    FROM table_name
    ) AS missing_values_colum2,

-- Subquery3   
    (SELECT
        (SELECT rows FROM total_rows) - COUNT(colum3) AS missing_colum3
    FROM table_name
    ) AS missing_values_colum3,

-- Subquery4    
    (SELECT
        (SELECT rows FROM total_rows) - COUNT(colum4) AS missing_colum4
    FROM table_name
    ) AS missing_values_colum4
;

Любой совет поможет. Заранее спасибо.

1 Ответ

0 голосов
/ 27 марта 2020

Мне не совсем ясно, чего вы хотите достичь.

Но для начала ваш существующий запрос может быть упрощен до:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...