Сводная таблица пропускает строки со значениями NULL

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

SELECT 
  id, 
  GROUP_CONCAT(if(colID = 1, value, NULL)) AS 'First Name',
  GROUP_CONCAT(if(colID = 2, value, NULL)) AS 'Last Name',
  GROUP_CONCAT(if(colID = 3, value, NULL)) AS 'Job Title'
FROM tbl
GROUP BY id;

Однако я хочу опустить строки, в которых value имеет значение null.


person IROEGBU    schedule 22.10.2014    source источник
comment
Итак, вы хотите исключить строку из result, если любая исходная строка для одного и того же идентификатора имеет value IS NULL? Просьба уточнить?   -  person Erwin Brandstetter    schedule 23.10.2014
comment
@ErwinBrandstetter да, спасибо.   -  person IROEGBU    schedule 23.10.2014


Ответы (2)


Я предполагаю, что вы хотите удалить результирующую строку, если какая-либо из исходных строк имеет value IS NULL.
Вы сможете добиться этого с помощью bit_and() в предложении HAVING:

SELECT id
     , max(CASE WHEN colID = 1 THEN value END) AS fn
     , max(CASE WHEN colID = 2 THEN value END) AS ln
     , max(CASE WHEN colID = 3 THEN value END) AS jt
FROM   tbl 
GROUP  BY id
HAVING bit_and(value IS NOT NULL);

Альтернатива:

...
HAVING count(*) = count(value);

Я не указывал ELSE NULL в операторах CASE, потому что (согласно документации):

Если не было соответствующего значения результата, возвращается результат после ELSE или NULL, если нет части ELSE.

person Erwin Brandstetter    schedule 23.10.2014

Просто добавьте это ограничение в оператор where вашего запроса, например:

SELECT 
  id, 
  GROUP_CONCAT(if(colID = 1, value, NULL)) AS 'First Name',
  GROUP_CONCAT(if(colID = 2, value, NULL)) AS 'Last Name',
  GROUP_CONCAT(if(colID = 3, value, NULL)) AS 'Job Title'
FROM tbl
WHERE value IS NOT NULL
GROUP BY id;

ИЗМЕНИТЬ

После некоторых тестов я смог заставить решение работать, но кажется интересным, почему value is not null не будет работать.

Ссылка на решение: http://sqlfiddle.com/#!2/b7a445/3

SELECT 
  id, 
  max(case when colID = 1 then value else '' end) AS fn,
  max(case when colID = 2 then value else '' end) AS ln,
  max(case when colID = 3 then value else '' end) AS jt
FROM tbl 
where not exists (select * from tbl b where tbl.id=b.id and value is null)
group by id
person Jorge Campos    schedule 22.10.2014
comment
извините, за путаницу, которую я вызвал. value - это столбец, на который я пытаюсь наложить ограничение - person IROEGBU; 23.10.2014
comment
Затем измените оператор where на value IS NOT NULL - person Jorge Campos; 23.10.2014
comment
Не работает (см. fiddle). Я хочу, чтобы последняя строка в запросе быть опущенным. - person IROEGBU; 23.10.2014
comment
Я тестирую ваш запрос, и мне очень странно, что он не работает. кажется, что групповая функция mysql игнорирует ограничение not null (предложение where). И чтобы проверить, является ли это поведением по умолчанию или нет, я тестировал другие базы данных, и только оракул работал как надо (sqlfiddle.com/#!4/8870c/1). внес несколько изменений в запрос в моих тестах, но принцип тот же. Поэтому мы должны задать экспертам по базам данных новый вопрос, почему это происходит. - person Jorge Campos; 23.10.2014
comment
@GordonLinoff, не могли бы вы помочь нам с этим? - person Jorge Campos; 23.10.2014
comment
Я нахожу решение, но оно кажется не слишком очевидным. Я задам вопрос об этом обсуждении. Я отредактирую ответ с окончательным запросом и скриптом sql. - person Jorge Campos; 23.10.2014
comment
@iroegbu, если вам, как и мне, достаточно любопытно, чтобы понять, почему stackoverflow.com/questions/26518305/ :) - person Jorge Campos; 23.10.2014
comment
Я пробовал всякие забавные вещи в пункте WHERE... видите, принял ответ, довольно чисто. - person IROEGBU; 23.10.2014
comment
@iroegbu Это действительно хороший ответ! Именно он прояснил проблему. Это до абсурда просто. Я думал о фильтрации значения, но это был идентификатор, который был сгруппирован. Итак, у вас есть три реестра с идентификатором 3 и один из них с нулевым значением, предложение where фильтрует его, но когда вы поворачиваете таблицу, у вас все еще есть два из них. :) - person Jorge Campos; 24.10.2014