我需要找到其一列属于同一值的所有行,并且还满足SQL Server 2008上的条件。
表格1:
col1 col2
100 0
100 1
100 1
200 0
200 0
200 0
300 0
300 0
200 0
我需要为同一个col1获取所有其col2 = 0的行。
我希望在这里
col1 col2
200 0
200 0
200 0
300 0
300 0
300 0
因为对于col1 = 200和col1 = 300,所有col2均为0
SELECT *
FROM table1 as a
where a.col2 = 0 # but, how to say col1 belong to the same value ?
谢谢!
由于您需要一组行的结果,因此可以使用分组,例如:
SELECT col1
FROM table1
GROUP BY col1
HAVING SUM(col2) = 0
;
这将为您提供总计为0的所有[distinct]col1
值col2
。当然,这假定SUM
在这种情况下适用-特别是,那col2
不是bit
,col2
也不能有负值。如果确实要检查0作为要具有(或不具有)的行的特定值,则可以使用其他聚合函数:
SELECT col1
FROM table1
GROUP BY col1
HAVING COUNT(NULLIF(col2, 0)) = 0
;
上面的查询将对col2
每组中的非0值进行计数,col1
并且仅返回col1
计数为0的那些值。
最后,如果您确实需要返回明细行而不是不同的col1
值,则可以将以上查询的结果用作派生表并在其上过滤源表:
SELECT *
FROM table1
INNER JOIN (
SELECT col1
FROM table1
GROUP BY col1
HAVING COUNT(NULLIF(col2, 0)) = 0
) AS filter
ON table1.col1 = filter.col1
;
但是,还有另一种可能更有效的方法,可以借助窗口聚合来完成此操作,如下所示:
SELECT
col1,
col2,
...
FROM (
SELECT *, cnt = COUNT(NULLIF(col2, 0)) OVER (PARTITION BY col1)
FROM table1
) AS s
WHERE cnt = 0
;
上面的查询中的计数将与明细数据一起返回,而外部查询将对其进行过滤以最终仅产生计数为0的行。不同之处在于,此方法仅引用源表一次,这可能导致比以前的方法更有效的查询计划。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句