Подсчитать количество NULL в строке - PullRequest
3 голосов
/ 13 августа 2010

Есть ли способ получить столбец с указанием количества пустых полей в строке? Это будет в операторе SELECT.

Например:

Field1  Field2  Num_Null
-----------------------
NULL     "A"      1

ОБНОВЛЕНИЕ: Я хочу этот запрос, чтобы я мог отсортировать по количеству продаж Партнеров по данной Книге. Таким образом, наличие 3 филиалов будет отсортировано выше, чем 2, независимо от того, какие из них. В моей базе данных около семи филиалов, и это будет расти. Поэтому любой запрос, требующий указания каждого поля для аффилированного лица, вероятно, будет слишком длинным

Таблица:

Affiliates_Cache - первичным ключом является Affiliate_ISBN, в котором указаны цены книги для различных филиалов (NULL, если ее нет) Affiliates_Cache - это тот, где я хочу посчитать количество NULL

Ответы [ 3 ]

3 голосов
/ 13 августа 2010

Я не уверен, есть ли более аккуратные методы, но это должно работать:

SELECT Field1, Field2, ISNULL(Field1) + ISNULL(Field2) Num_Null
FROM   YourTable;

Контрольный пример:

CREATE TABLE YourTable (Field1 varchar(10), Field2 varchar(10));

INSERT INTO YourTable VALUES (NULL, 'A');
INSERT INTO YourTable VALUES ('B', 'C');
INSERT INTO YourTable VALUES ('B', NULL);
INSERT INTO YourTable VALUES (NULL, NULL);

Результат:

+--------+--------+----------+
| Field1 | Field2 | Num_Null |
+--------+--------+----------+
| NULL   | A      |        1 |
| B      | C      |        0 |
| B      | NULL   |        1 |
| NULL   | NULL   |        2 |
+--------+--------+----------+
4 rows in set (0.00 sec)

ОБНОВЛЕНИЕ: В дополнение к обновленному вопросу:

Если в вашей таблице есть столбцы, которые выглядят как affiliate_1, affiliate_2 и т. Д., Это редко хорошая идея.как вы будете смешивать данные с метаданными.В общем, рекомендуемое исправление заключается в использовании другой зависимой таблицы для отношений пользователей с филиалами, как в следующем примере:

CREATE TABLE users (
   user_id int, 
   user_name varchar(100),
   PRIMARY KEY (user_id)
) ENGINE=INNODB;

CREATE TABLE users_affiliates (
   user_id int, 
   affiliate_name varchar(100),
   PRIMARY KEY (user_id, affiliate_name),
   FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;

Затем сортировка таблицы users по количеству филиалов будет выглядетьчто-то вроде этого:

SELECT    u.*, d_tb.num_aff
FROM      users
JOIN      (
             SELECT   user_id, COUNT(*) num_aff
             FROM     users_affiliates
             GROUP BY user_id
          ) d_tb ON (d_tb.user_id = u.user_id)
ORDER BY  d_tb.num_aff DESC;

Преимуществ много, но самое главное это делает запросы, такие как приведенные выше, простыми в написании и достаточно гибкими для работы с любым количеством филиалов (не ограниченных количествомстолбцы, которые вы выделили).

0 голосов
/ 13 августа 2010

Сохраняйте это простым и стандартным:

SELECT Field1, Field2, 
       CASE WHEN Field1 IS NULL THEN 1 ELSE 0 END
       + CASE WHEN Field2 IS NULL THEN 1 ELSE 0 END
       AS Num__Null
  FROM YourTable;

Контрольный пример полностью:

WITH YourTable (Field1, Field2)
     AS 
     (
      SELECT CAST(Field1 AS VARCHAR(10)), 
             CAST(Field2 AS VARCHAR(10))
        FROM (
              VALUES (NULL, 'A'),
                     ('B', 'C'),
                     ('B', NULL),
                     (NULL, NULL)
             ) AS YourTable (Field1, Field2)
     )
SELECT Field1, Field2, 
       CASE WHEN Field1 IS NULL THEN 1 ELSE 0 END
       + CASE WHEN Field2 IS NULL THEN 1 ELSE 0 END
       AS Num__Null
  FROM YourTable;
0 голосов
/ 13 августа 2010

Как насчет этого запроса?(Ссылаясь на Тестовый пример, данный Дэниелом.)

SELECT Field1, Field2, (2 - (COUNT(ALL Field1)+COUNT(ALL Field2)))  Num_Null
FROM   @YourTable
GROUP BY Field1, Field2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...