SQL Group By игнорировать общие поля по группам - PullRequest
1 голос
/ 19 апреля 2020

У меня есть варианты продукта, которые я хочу получить как группу, и игнорирую все поля, которые являются общими для одной возвращенной совокупной записи. Неясно, сколько или в каких полях будут использоваться разные варианты. Это пример таблицы

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(6) unsigned NOT NULL,
  `name` varchar(200),
  `variantId` int(3),
  `size` varchar(200),
  `color` varchar(200),
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `products` (`id`, `name`, `variantId`, `size`, `color`) VALUES
  ('1', 'SoccerBalls', '1', '3', 'Black-white'),
  ('2', 'SoccerBalls', '1', '4', 'Black-white'),
  ('3', 'SoccerBalls', '1', '5', 'Black-white'),
  ('4', 'RefereeCard', '2', null, 'yellow'),
  ('5', 'RefereeCard', '2', null', 'red'),
  ('6', 'Jersey', '3', 'L', 'Tottenham'),
  ('7', 'Jersey', '3', 'M', 'Chelsea'),
  ('8', 'Jersey', '3', 'S', 'Arsenal');

То, что я хочу получить как выход, это что-то вроде:

null, SoccerBalls, null, null, Black-white
null, RefereeCard, null, null, null,
null, Jersey, null, null, null

1 Ответ

0 голосов
/ 19 апреля 2020

Я думаю, что вы хотите:

select (case when min(id) = max(id) then min(id) end) as id,
       name, variantid,
       (case when min(size) = max(size) then min(size) end) as size,
       (case when min(color) = max(color) then min(color) end) as color
from products
group by variantid, name;

Если значения могут быть NULL, то вам нужно дополнительное условие - если вы хотите обработать NULL как еще одно другое значение:

select (case when min(id) = max(id) then min(id) end) as id,
       name, variantid,
       (case when min(size) = max(size) and count(size) = count(*)
             then min(size)
        end) as size,
       (case when min(color) = max(color) and count(color) = count(*)
             then min(color)
        end) as color
from products
group by variantid, name;

Очевидно, вам не нужна эта проверка на id, потому что это первичный ключ.

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