Как считать нулевые значения из нескольких столбцов - PullRequest
1 голос
/ 26 мая 2011

В моей таблице SQL 2005 есть следующий шаблон данных:

MPAN, Date, Reading1, Reading2, Reading3,......, Reading48

134, 21/05/11, , ,0.345 ,......,0.789

134, 22/05/11, , , ,......, 0.467

456, 21/05/11, , , , , 1.234

456, 22/05/11, 0.009 , , 0.534,......

223, 21/05/11, , , ,........, 3.345

223, 22/05/11, 3.223, 1.234, , , ....,0.989

Для каждой строки записи имеется различное количество полей, в которых отсутствуют данные.Как я могу узнать, сколько файлов не содержит данных для каждой строки (сгруппировать по MPAN и дате).Был ли поиск в Google, кажется, что люди предлагают хранимые процедуры для аналогичного случая?

Пожалуйста, вы можете помочь?

Ответы [ 7 ]

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

Обычный подход заключается в использовании CASE:

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

С именами групп и полей из вашего вопроса:

SELECT MPAN, Date,
       SUM(CASE WHEN Reading1 IS NULL THEN 1 ELSE 0 END
       + CASE WHEN Reading2 IS NULL THEN 1 ELSE 0 END
       + ... ) AS total_nulls
FROM table 
GROUP BY MPAN, Date;
1 голос
/ 27 мая 2011
SELECT
  MPAN,
  Date,
  NullCount = COUNT(*) * 48
    - COUNT(Reading1)
    - COUNT(Reading2)
    - COUNT(Reading3)
    …
    - COUNT(Reading48)
FROM atable
GROUP BY MPAN, Date
0 голосов
/ 27 мая 2011

ИСПОЛЬЗУЙТЕ ЭТО

select 
MPAN, Date,
coalesce(isnull(reading1,0)+isnull(reading2,0)+isnull(reading3,0)+isnull(reading4,0),0) 
from 
tablename
0 голосов
/ 26 мая 2011
select MPAN,
       Date,
       sum
          (
            case when Reading1 is null then 1 else 0 end +
            case when Reading2 is null then 1 else 0 end +
            case when Reading3 is null then 1 else 0 end
          ) as NullCount
from T
group by MPAN,
         Date
0 голосов
/ 26 мая 2011

Если вы можете изменить схему, первое, что я хотел бы сделать, это разбить ее на три таблицы:

«Показания» с идентификатором и именем, значения, такие как

ID  Name
1   Reading1
2   Reading2
...
48  Reading48

Это позволяет легко добавлять больше, как вы, несомненно, сделаете.

Далее, таблица 'MPAN' с 'MPAN с ID, MPAN и датой:

ID MPAN Date
1  134  21/05/11
2  134  22/05/11

И, наконец,Таблица «Оценка», которая связывает эти две категории и включает в себя оценки с помощью ReadID, MPANID и Score:

MPANID ReadingID Score
1      3         0.345
1      48        0.789
2      48        0.467

Затем вы можете позволить реляционным базам данных делать то, что они делают лучше всего, и использовать отношения.Например, этот запрос получит все MPAN, которые получили оценку за чтение 2:

SELECT MPAN.*, Scores.Score
  FROM MPAN
  JOIN Scores ON Scores.MPANID = MPAN.ID
             AND Scores.ReadingID = 2
0 голосов
/ 26 мая 2011

Боюсь, тебе придется сделать что-то уродливое, как

select MPAN, Date, (
    CASE WHEN Reading1 is null then 1 else 0 end +
    CASE WHEN Reading2 is null then 1 else 0 end +
    CASE WHEN Reading3 is null then 1 else 0 end +
    CASE WHEN Reading4 is null then 1 else 0 end +
    ... +
    CASE WHEN Reading48 is null then 1 else 0 end
) as CountOfNulls

from YourTable
0 голосов
/ 26 мая 2011

Используйте инструкцию case для вычисления суммы:

select MPAN, date, sum(null_cnt) from (
  select MPAN, date,
  (case when val1 is null then 1 else 0 end) +
  (case when val2 is null then 1 else 0 end) + ...
  (case when val48 is null then 1 else 0 end) null_cnt
  from ...
) group by MPAN, date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...