Tsql T-SQL group by和all过滤器

Tsql T-SQL group by和all过滤器,tsql,group-by,Tsql,Group By,请编辑我的问题以获得更好的标题(并删除此行) 嗨,我有一张桌子 id|Col_A|Col_B| --|-----|-----| 1| A | NULL| 2| A | a | 3| B | a | 4| C | NULL| 5| C | NULL| 我只想选择所有列B都为空的行,按列A分组(即在本例中只返回C) 尝试 这给了我A和C。我也试过了 SELECT Col_A, Col_B FROM MYTABLE GROUP BY Col_A, Col_B H

请编辑我的问题以获得更好的标题(并删除此行)

嗨,我有一张桌子

id|Col_A|Col_B|
--|-----|-----|
 1|  A  | NULL|
 2|  A  |  a  |
 3|  B  |  a  |
 4|  C  | NULL|
 5|  C  | NULL|
我只想选择所有列B都为空的行,按列A分组(即在本例中只返回C)

尝试

这给了我A和C。我也试过了

SELECT Col_A, Col_B FROM MYTABLE GROUP BY Col_A, Col_B HAVING Col_B IS NULL
这也给了我A和C

如何编写一个T-SQL查询,仅当所有组都符合条件时才选择一个组? 谢谢

这似乎有效:

declare @t table (id int,Col_A char(1),col_b char(1))
insert into @t(id,Col_A,Col_B) values
(1,'A',NULL),
(2,'A', 'a'  ),
(3,'B', 'a'  ),
(4,'C',NULL),
(5,'C',NULL)

select Col_A from @t group by Col_A having MAX(Col_B) is null
因为如果所有输入都是
NULL
,则
MAX
(或
MIN
)只能返回
NULL

结果:

Col_A
-----
C

类似地,如果您想检查所有特定的非空值的所有值,您可以通过首先确认该列的
MIN()
MAX()
相等,然后根据所寻求的值检查其中一个:

select Col_A from @t group by Col_A
having MAX(Col_B) = MIN(Col_B) and
       MIN(Col_B) = 'a'

只返回
B
,因为这是唯一一个所有输入值都等于
a

的组,使用MAX和MIN真是个好主意!非常感谢!
select Col_A from @t group by Col_A
having MAX(Col_B) = MIN(Col_B) and
       MIN(Col_B) = 'a'