Utilisation de WHERE avec Group By et Ayant

Disons que j'ai une table avec 3 colonnes (a, b, c) avec les valeurs suivantes:

 +---+------+---+ | a | b | c | +---+------+---+ | 1 | 5 | 1 | | 1 | NULL | 1 | | 2 | NULL | 0 | | 2 | NULL | 0 | | 3 | NULL | 5 | | 3 | NULL | 5 | +---+------+---+ 

Ma sortie désirée: 3

Je veux sélectionner seulement les valeurs distinctes de la colonne a pour lesquelles chaque occurrence de cette valeur a la valeur NULL dans la colonne b étant donné que la valeur dans c n'est pas 0. Par conséquent, de la sortie désirée, "1" un "5" dans la colonne b même s'il y a une valeur NULL pour la 2ème occurrence de "1". Et "2" ne viendra pas parce que la valeur de c est 0

La requête que j'utilise actuellement et qui ne fonctionne pas:

 SELECT a FROM tab WHERE c!=0 GROUP BY a HAVING COUNT(b) = 0 

Vous pouvez le faire en utilisant la clause HAVING :

SQL Fiddle

 SELECT a FROM tbl GROUP BY a HAVING SUM(CASE WHEN b IS NOT NULL OR c = 0 THEN 1 ELSE 0 END ) = 0 

Je pense que c'est l'article que vous voulez:

 select a from table t group by a having count(case when c <> 0 then b end) = 0 and max(c) > 0 

Cela suppose que c est non négatif.

Cependant, il n'est pas tout à fait clair pourquoi "2" ne répond pas à votre condition. Il n'y a pas de ligne où "c" n'est pas zéro. Par conséquent, toutes ces lignes ont des valeurs NULL .

 DECLARE @Table TABLE ( A INT ,B INT ,C INT ) INSERT INTO @Table SELECT 1,5,1 INSERT INTO @Table SELECT 1,NULL,1 INSERT INTO @Table SELECT 2,NULL,0 INSERT INTO @Table SELECT 2,NULL,0 INSERT INTO @Table SELECT 3,NULL,5 INSERT INTO @Table SELECT 3,NULL,5 SELECT a,max(b) [MaxB],max(C) [MaxC] FROM @Table GROUP BY A HAVING max(b) IS NULL AND ISNULL(max(C),1)<>0 

Bien que vous ayez déjà 3 réponses, j'ai décidé de consortingbuer mon 2c …

La requête de Ghost est la plus efficace lorsque je vérifie l'parsingur SQL Server Query. Cependant, je suspecte que si votre jeu de données change, la requête de Ghost ne soit pas exactement conforme à ce que vous avez écrit.

Je pense que la requête ci-dessous correspond à ce que vous searchz au coût d'exécution le plus bas en SQL, basé uniquement sur vos besoins écrits par opposition à l'exemple de données que vous avez fourni ( Remarque: cette requête est similaire aux réponses de Felix et Gordon , cependant, je n'ai pas inclus un "cas" conditionnel déclaration dans ma clause ayant ).

 SELECT DISTINCT(a) FROM intTable GROUP BY a HAVING SUM(ISNULL(b,0))=0 AND SUM(c)<>0 

J'espère que cela t'aides!