我们说我有一个包含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
答案 0 :(得分:2)
您可以使用HAVING
子句执行此操作:
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
希望这有帮助!