Количество строк с указанным количеством пустых столбцов - PullRequest
0 голосов
/ 17 мая 2011

Как получить информацию о том, сколько строк в таблице содержит определенное количество нулей?
Я хочу получить что-то вроде этого:

Number of nulls | Number of rows
        0       |      10
        1       |       4
        2       |      11

Мотивация
Мне нужно это для целей интеллектуального анализа данных. Если, например, у меня есть наблюдение, которое почти во всех столбцах имеет нулевое значение, то мне нужно избавиться от этого наблюдения, но также может быть ситуация, когда многие наблюдения имеют небольшое значение нуля, что приемлемо.

Ответы [ 3 ]

4 голосов
/ 17 мая 2011

Используя только SQL, вам придется прибегнуть к неприятному коду, например:

SELECT CASE WHEN column1 IS NULL THEN 1 ELSE 0 END
       + CASE WHEN column2 IS NULL THEN 1 ELSE 0 END
       + ... AS num_nulls,
       COUNT(*) as num_rows
FROM table 
GROUP BY num_nulls;

Также обратите внимание, что не все диалекты SQL поддерживают ссылки на вычисляемый столбец, увы, в предложении GROUP BY,так что вы можете получить гораздо более уродливый запрос.Само собой разумеется, вы также должны будете сделать разные запросы для каждой таблицы.Конечно, вы можете сгенерировать запрос, используя INFORMATION_SCHEMA voodoo ...

1 голос
/ 17 мая 2011

Для SQL Server 2008 вы можете сделать

DECLARE @T TABLE
(
pk INT PRIMARY KEY, 
c1 INT,
c2 INT,
c3 VARCHAR(10)
)

INSERT INTO @T
SELECT 1,1,1,'foo'
UNION ALL
SELECT 2,1,NULL,'bar'
UNION ALL
SELECT 3,NULL,NULL,NULL
UNION ALL
SELECT 4,NULL,NULL,NULL


SELECT Num AS [Number of Nulls],
       COUNT(*) AS [Number of rows]
FROM @T
CROSS APPLY (SELECT COUNT(*) - COUNT(c) FROM (VALUES(cast(c1 as SQL_VARIANT)),
                                                    (c2),
                                                    (c3)) T (c)) CA(Num)
GROUP BY Num
1 голос
/ 17 мая 2011

Что-то вроде:

select MyCol, Count(MyCountCol) from 
(select 0 + 
      case  when Col1 is null then 1 else 0 end 
      + case  when Col2 is null then 1 else 0 end 
      -- + whatever other col names are in your table  
      as MyCountCol

from MyTable)
group by MyCol
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...