/ / Clause HAVING: au moins une des valeurs non groupées est X - sql, sql-server, tsql, sql-server-2014

Clause HAVING: au moins une des valeurs non groupées est X - sql, sql-server, tsql, sql-server-2014

Exemple de tableau:

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

Sortie:

A

Je veux obtenir toutes les valeurs de Col1 qui ont plus d'une entrée et au moins une avec Banana.

J'ai essayé d'utiliser GROUP BY:

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

Comment reformuler le HAVING clause que ma requête fonctionne?

Réponses:

10 pour la réponse № 1

Utilisation agrégation conditionnelle:

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

Vous pouvez vérifier conditionnellement Col1 groupes ayant au moins un "Banana" valeur en utilisant COUNT avec CASE expression à l'intérieur.

Veuillez noter que le premier COUNT doit utiliser DISTINCT, de sorte que les groupes avec au moins deux différent Col1 des valeurs sont détectées. Si par avoir plus d'une entrée tu veux dire aussi des rangées ayant le même Col2 valeurs répétées plusieurs fois, vous pouvez ignorer DISTINCT.


1 pour la réponse № 2
SELECT Col1
FROM Table
GROUP BY Col1
HAVING count(*) > 1
AND Col1 in (select distinct Col1 from Table where Col2 = "Banana");

1 pour la réponse № 3

Voici une approche simple:

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

0 pour la réponse № 4

Essaye ça,

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