使用WHERE与分组依据

时间:2015-10-08 01:29:23

标签: 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列中每次出现此值都为NULL。因此,从我想要的输出中," 1"不会进来,因为有一个" 5"在b列中,即使第二次出现" 1"有一个NULL。并且" 2"因为c的值为0而无法进入。

我目前使用的查询无效:

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

4 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:0)

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

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

这假定c是非负面的。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

虽然你已经有3个答案,但我决定贡献我的2c ......

当我签入SQL Server查询分析器时,来自Ghost的查询效率最高,但是,我怀疑你的数据集是否会根据你所写的内容改变Ghost的查询可能不是你想要的。

我认为下面的查询是您在SQL中以最低的执行成本寻找的,只是基于您的书面要求,而不是您提供的数据示例(注意:此查询性能是然而,类似于Felix和Gordon的答案,我没有在我的条款中包含有条件的“案例”陈述。)。

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

希望这有帮助!