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 для которых одновременно справедливы ряд условий:
- type<>555 и count=0
- 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