2015-11-25 3 views
4

Пример таблицы:HAVING условие: по крайней мере, один из несгруппированных значений X

Col1 | Col2 
A | Apple 
A | Banana 
B | Apple 
C | Banana 

Выход:

A 

Я хочу, чтобы получить все значения Col1, которые имеют более чем одну запись и на по меньшей мере один с Banana.

Я пытался использовать GROUP BY:

SELECT Col1 
FROM Table 
GROUP BY Col1 
HAVING count(*) > 1 
AND ??? some kind of ONEOF(Col2) = 'Banana' 

Как перефразировать пункт HAVING, который работает мой запрос?

ответ

10

Использование условной агрегации:

SELECT Col1 
FROM Table 
GROUP BY Col1 
HAVING COUNT(DISTINCT col2) > 1 AND 
     COUNT(CASE WHEN col2 = 'Banana' THEN 1 END) >= 1 

можно условно проверить Col1 групп, имеющих по меньшей мере, один'Banana' значение, используя COUNT с выражением CASE внутри него.

Пожалуйста, обратите внимание, что первый COUNT должен использовать DISTINCT, так что разныеCol1 значения обнаруживаются группы с по меньшей мере двух . Если по , имеющему более одной записи, вы имеете в виду также строки с одинаковыми значениями Col2, повторяющимися более одного раза, тогда вы можете пропустить DISTINCT.

+0

Спасибо, буду принимать как можно скорее. –

1
SELECT Col1 
FROM Table 
GROUP BY Col1 
HAVING count(*) > 1 
AND Col1 in (select distinct Col1 from Table where Col2 = 'Banana'); 
+0

Спасибо, тоже. –

0

Попробуйте это,

declare @t table(Col1 varchar(20), Col2 varchar(20)) 
insert into @t values('A','Apple') 
,('A','Banana'),('B','Apple'),('C','Banana') 

select col1 from @t A 
where exists 
(select col1 from @t B where a.col1=b.col1 and b.Col2='Banana') 
group by col1 
having count(*)>1 
1

Вот простой подход:

SELECT Col1 
FROM table 
GROUP BY Col1 
HAVING COUNT(DISTINCT CASE WHEN col2= 'Banana' THEN 1 ELSE 2 END) = 2