sql исключение из множества повторяющихся строк и значений

1. Имеется табл item

id type count
1 201 0
1 555 2
1 201 3
1 202 0
1 555 4
2 201 0
2 555 6
2 201 0
2 202 0
2 555 0

2. Задача Найти все id для которых одновременно справедливы ряд условий:

  1. type<>555 и count=0
  2. type=555 и count<>0

3. Ожидаемый результат

id type count
2 555 6

4. Вариант sql query

select * 
from item where id in 
  (select distinct(id) 
   from item where 
   type<>555 и count=0
  ) 
 and type=555 и count<>0

Возвращаются все id. Подскажите пож-та что еще можно попробовать?


Ответы (1 шт):

Автор решения: Akina

Найти все id для которых одновременно справедливы ряд условий:

  • type<>555 и count=0
  • type=555 и count<>0

Шаблон:

SELECT id
FROM item
GROUP BY id
HAVING SUM(CASE WHEN {условие 1} THEN 0 ELSE 1 END) = 0
   AND SUM(CASE WHEN {условие 2} THEN 0 ELSE 1 END) = 0
-- ...

Запрос проверяет, что для данного id отсутствуют записи, не соответствующие условиям.

Обычно условия должны быть взаимоисключающими - т.е. никакая запись не должна соответствовать более чем одному условию.

Т.е. для приведённой задачи (в ней условия как раз взаимоисключающие) будет

SELECT id
FROM item
GROUP BY id
HAVING SUM(CASE WHEN type <> 555 AND count = 0 THEN 0 ELSE 1 END) = 0
   AND SUM(CASE WHEN type = 555 AND count <> 0 THEN 0 ELSE 1 END) = 0
→ Ссылка