Sql server 使用WHERE和Group By以及Having

Sql server 使用WHERE和Group By以及Having,sql-server,tsql,Sql Server,Tsql,假设我有一个表,有3列(a,b,c),其中包含以下值: +---+------+---+ | a | b | c | +---+------+---+ | 1 | 5 | 1 | | 1 | NULL | 1 | | 2 | NULL | 0 | | 2 | NULL | 0 | | 3 | NULL | 5 | | 3 | NULL | 5 | +---+------+---+ 我想要的输出:3 我只想从列a中选择那些不同的值,如果c中的值不是0,则该值的每一次出现在列b中都为N

假设我有一个表,有3列
(a,b,c)
,其中包含以下值:

+---+------+---+
| a |  b   | c |
+---+------+---+
| 1 |  5   | 1 |
| 1 | NULL | 1 |
| 2 | NULL | 0 |
| 2 | NULL | 0 |
| 3 | NULL | 5 |
| 3 | NULL | 5 |
+---+------+---+
我想要的输出:3

我只想从列a中选择那些不同的值,如果c中的值不是0,则该值的每一次出现在列b中都为NULL。因此,从我想要的输出来看,“1”不会出现,因为b列中有一个“5”,即使第二次出现“1”时有一个空值。因为c的值是0,所以“2”不会出现

我当前使用的查询不起作用:

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

您可以使用
HAVING
子句执行此操作:


我认为这是您想要的
having
子句:

select a
from table t
group by a
having count(case when c <> 0 then b end) = 0 and
       max(c) > 0
选择一个
来自表t
分组
具有计数(c 0然后b端的情况)=0和
最大值(c)>0
这假设
c
为非负

然而,还不完全清楚为什么“2”不符合您的条件。没有“c”不为零的行。因此,所有这些行都有
NULL
值。

DECLARE@Table(
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
整数 ,B INT ,C INT ) 插入@Table选择1,5,1 插入@Table SELECT 1,NULL,1 插入@Table SELECT 2,空,0 插入@Table SELECT 2,空,0 插入@Table SELECT 3,NULL,5 插入@Table SELECT 3,NULL,5 挑选 a、 最大值(b)[MaxB],最大值(C)[MaxC] 来自@Table 分组 有max(b)是NULL,有ISNULL(max(C),1)0
虽然你已经有了3个答案,但我决定贡献我的2c

当我签入SQL Server查询分析器时,来自Ghost的查询效率最高,但是,我怀疑如果您的数据集发生更改,Ghost的查询可能与您所编写的内容不完全相同

我认为下面的查询是SQL中执行成本最低的查询,只是基于您的书面需求,而不是您提供的数据示例(注意:此查询性能类似于Felix和Gordon的答案,但是,我没有在having子句中包含条件“case”语句)

从intTable中选择DISTINCT(a)
分组
具有SUM(ISNULL(b,0))=0和SUM(c)0的

希望这有帮助

我相信
DISTINCT
在这里没有任何作用,你是如何准确地测试它的?是的,你是对的,根据group by子句,它是多余的,应该删除它,但我在执行查询时修改了几次,所以它留在了那里。@Felix-我对示例数据集运行了几次,然后查看了查询计划分析器中所需的性能和步骤。哦,这还不足以进行测试。尝试用一百万行测试它。
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
SELECT DISTINCT(a) FROM intTable 
GROUP BY a
HAVING SUM(ISNULL(b,0))=0 AND SUM(c)<>0