Выберите все строки, которые содержат все элементы группы - PullRequest
0 голосов
/ 18 марта 2019

В столбце [TYPE] есть A, B или C. Я хочу выбрать список имен, в таблице которых есть все A, B, C.

enter image description here

Результат

enter image description here


    -- dealing with count
    select name from tempso group by name 
    having count(*) = (select count(distinct type) from tempso);

    -- dealing with specifying elements
    select name from tempso group by name 
    having type in all('A', 'B', 'C');

На самом деле, я хотел сделать это вторым методом, потому что у ТИПОВ A, B, C есть подтипы, поэтому существует риск дублирования, но я получил эту ошибку ниже.

Msg 156, Level 15, State 1, Line 10 syntax error 'all'...

Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 18 марта 2019

Вы можете использовать group by и having:

select name
from t
group by name
having count(*) = (select count(distinct type) from t);

Это предполагает, что строки name / type не повторяются в таблице.

Редактировать:

Если вы просто хотите проверить A / B / C, то:

select name
from t
where type in ('A', 'B', 'C')
group by name
having count(*) = 3;

Или:

having count(distinct type) = 3

, если в таблице есть дубликаты.

0 голосов
/ 18 марта 2019

выберите имя из @table, где введите группу IN ('A', 'B', 'C') по имени, имеющему количество (имя)> = 3

0 голосов
/ 18 марта 2019

Вы используете недопустимую функцию 'все'.а также он не работает недействительным в предложении HAVING. Так, пожалуйста, попробуйте это.

SELECT name,count(*)  AS cnt FROM tempso 
WHERE [type] in ('A', 'B', 'C')
GROUP BY name HAVING count(Name) >= 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...