查找其中一列属于同一值并且另一列满足SQL Server 2008中的条件的所有行

用户名

我需要找到其一列属于同一值的所有行,并且还满足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 ? 

谢谢!

安德烈·M

由于您需要一组行的结果,因此可以使用分组,例如:

SELECT col1
FROM table1
GROUP BY col1
HAVING SUM(col2) = 0
;

这将为您提供总计为0的所有[distinct]col1col2。当然,这假定SUM在这种情况下适用-特别是,那col2不是bitcol2也不能有负值。如果确实要检查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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SQL Server查询以显示所有列,但其中一列具有不同的值(不对任何内容进行分组)

SQL Server:仅当同一表中的另一列是特定值时,才如何强制在一列中使用NOT NULL?

如果另一列在SQL Server中相同,则获取具有最小列值的行

如何在没有条件的情况下将行从一列绑定到SQL Server中的另一列

使用SQL Server中的两个条目(值)在同一表中使用另一列更新一列

转置\枢轴对具有两列的行,其中一列是DateTime,另一列是SQL Server中的Text

对熊猫数据框中的一列求和,其中一列满足条件,但另一列分组

无法根据SQL Server中另一列的条件从列中检索不同的行

将同一表中的一列中的值更新为SQL Server中的另一列

显示两列,但其中一列与SQL Server中另一个表中的另一列合并

SQL Server总和超过一列而另一列作为条件

SQL Server 2008 R2,为另一列的每个不同值选择一列的一个值

如何使用SQL Server解析表中一列中的数据并将结果放入另一列中?

选择不重复的行,其中列中的所有值均是同一SQL Server

SQL Server查询以查找按一列分组但在其他至少一列中不同的值

SQL Server:列的自动增量,按另一列中的值分区

将同一行中的多个结果行按SQL Server 2008中的一列分组

检索满足另一列中条件组合的一列中的所有不同值(SQL)

SQL:如果满足条件,则将值从列复制到同一列中的另一行

设置基于 SQL Server 插入的方法,其中一列从同一列计算为 Max

从另一列中减去一列并运行 SQL Server 2008 R2

SQL Server:求和(或差)列的每个组值,直到满足另一列的条件

SQL Server 中的条件列基于另一列

比较 SQL Server 中同一列的两个值

如何使用 SQL Server 中另一列的数据更新一列?

SQL Server:选择同一列中具有相同值的2行的最大日期/时间

SQL Server:从同一列中具有匹配值的第一行之后的列中选择所有行

SQL Server:如何在一列中拆分字符串並將值分配給另一列(沒有額外的行!)

SQL Server - 僅當同一列和表中該用戶 ID 存在值 B 時,才排除具有值 A 的所有行