SQL - Есть ли способ определить, присутствует ли значение в столбце, сгруппированном по значениям из другого столбца? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть таблица, которая выглядит следующим образом:

Name              Toys present

A1     ------      Dinosaur-1        
A1     ------      Dinosaur-2        
A1     ------      Dinosaur-3   
A1     ------      Dinosaur-1    
A1     ------      Dinosaur-5    
A2     ------      Dinosaur-1       
A2     ------      Dinosaur-2      
A2     ------      Dinosaur-3     
A3     ------      Dinosaur-2     
A3     ------      Dinosaur-2    
A3     ------      Dinosaur-2    
A4     ------      Dinosaur-3    
A4     ------      Dinosaur-3    
A5     ------      Dinosaur-1    
A5     ------      Dinosaur-1    
A5     ------      Dinosaur-1

Есть ли значение для возврата Имен, у которых нет игрушек «Динозавр-1» с ними? В приведенном выше примере это будут «A3» и «A4». Я с трудом отфильтровываю, имеет ли название, которое может иметь несколько игрушек, именно эту игрушку или имеет. Я пробовал предложения Group By и Have, а также поиграл с CTE, но безуспешно.

Пожалуйста, сообщите и спасибо.

1 Ответ

2 голосов
/ 02 апреля 2020

Вы можете группировать по name и фильтровать по группам, у которых нет toy, называемых 'Dinosaur-1', например:

select name
from mytable
group by name
having max(toy = 'Dinosaur-1') = 0

Выражение toy = 'Dinosaur-1', когда оценивается MySQL в цифрах c context, возвращает 0 для false и 1 для true; поэтому максимальное значение 0 указывает, что ни одна строка в группе не удовлетворяет условию.

Примечание: если вы работаете с DB2 (которую вы тоже пометили), вы можете изменить предложение having на:

having max(case when toy = 'Dinosaur-1' then 1 else 0 end) = 0
...