选择具有条件和分组的计数

时间:2012-06-28 19:24:34

标签: sql-server count group-by

这里有人可以轻松点一下,请看下面的数据表:

EventCode  ProcessId
---------- ---------
2          1
-6         3
42         1
-6         2
-12        2
23         4
4          2
-23        1
12         3
-26        1

我需要一个查询,它将获得所有进程ID的计数,其中存在负面事件代码。因此,从上面的数据集中,结果将是3(进程ID的1,2和3具有负的事件代码,进程ID 4没有)

可能非常简单,涉及群体,但我根本看不到树木。

除此之外,此表中有数百万行。

5 个答案:

答案 0 :(得分:4)

SELECT COUNT(DISTINCT ProcessID) FROM table
WHERE EventCode < 0

答案 1 :(得分:1)

快速回答是

SELECT COUNT(DISTINCT t.ProcessId)
  FROM mytable t
 WHERE t.EventCode < 0
   AND t.ProcessId IS NOT NULL

(没有必要在ProcessId上包含谓词;我在这里指出COUNT不包含NULL值。)

这是最简单的方法,但不是唯一的方法。

其他可能的查询的性能实际上取决于表的组织(HEAP或CLUSTERED)以及可用的索引。

答案 2 :(得分:1)

如果有多个具有相同ProcessId的负值:

SELECT COUNT(DISTINCT ProcessId) FROM table WHERE EventCode < 0;

答案 3 :(得分:1)

如果您想要按ProcessId分组的计数,请执行以下操作:

SELECT COUNT(*), [ProcessId] 
FROM TBL
WHERE [EventCode] < 0
GROUP BY [ProcessId]

如果您想要完整的负数:

SELECT COUNT(DISTINCT([ProcessId])) FROM Tbl WITH (NOLOCK) WHERE [EventCode] < 0

表现出色: 在列EventCode上创建已过滤的非聚集索引,并包含列ProcessId,其中EventCode&lt; 0

答案 4 :(得分:-1)

希望你的意思是:

select count(*) from (YourTableNameHere) where EventCode < 0