是否有可能在Count()中指定条件?

是否有可能在Count()指定一个条件? 我只想计算位置列中具有例如“经理”值的行。

编辑: 仔细阅读,我想要IN计数语句,不使用WHERE ; 我在问这个问题,因为我需要在同一个select( Count(Position = Manager), Count(Poisition = Other))统计两个Managers和Other,所以在这个例子中WHERE对我没有用处

如果您不能仅仅使用where子句限制查询本身,则可以使用count聚合只计算非空值的事实:

 select count(case Position when 'Manager' then 1 else null end) from ... 

你也可以用类似的方法使用sum聚合:

 select sum(case Position when 'Manager' then 1 else 0 end) from ... 

假设你不想限制返回的行,因为你正在聚合其他的值,你可以这样做:

 select count(case when Position = 'Manager' then 1 else null end) as ManagerCount from ... 

比方说,在同一专栏中,你有经理,主pipe和团队领导的价值,你可以得到每一个这样的计数:

 select count(case when Position = 'Manager' then 1 else null end) as ManagerCount, count(case when Position = 'Supervisor' then 1 else null end) as SupervisorCount, count(case when Position = 'Team Lead' then 1 else null end) as TeamLeadCount, from ... 

取决于你的意思,但意义的另一种解释是你想用某个值来计算行的位置,但不想限制SELECT到JUST那些行。

你可以用SUM()和子句来代替COUNT(),例如:

 SELECT SUM(CASE WHEN Position = 'Manager' THEN 1 ELSE 0 END) AS ManagerCount, SUM(CASE WHEN Position = 'CEO' THEN 1 ELSE 0 END) AS CEOCount FROM SomeTable 

如果您使用SQL 2005或更高版本,也可以使用Pivot关键字

更多信息和来自Technet

 SELECT * FROM @Users PIVOT ( COUNT(Position) FOR Position IN (Manager, CEO, Employee) ) as p 

testing数据集

 DECLARE @Users TABLE (Position VARCHAR(10)) INSERT INTO @Users (Position) VALUES('Manager') INSERT INTO @Users (Position) VALUES('Manager') INSERT INTO @Users (Position) VALUES('Manager') INSERT INTO @Users (Position) VALUES('CEO') INSERT INTO @Users (Position) VALUES('Employee') INSERT INTO @Users (Position) VALUES('Employee') INSERT INTO @Users (Position) VALUES('Employee') INSERT INTO @Users (Position) VALUES('Employee') INSERT INTO @Users (Position) VALUES('Employee') INSERT INTO @Users (Position) VALUES('Employee') 

@Guffa的回答非常好,只是指出IF语句可能更清晰

 select count(IF(Position = 'Manager', 1, NULL)) as ManagerCount from ... 

我知道这真的很老,但我喜欢这种场景的NULLIF技巧,到目前为止我还没有发现任何缺点。 只要看看我的复制和可粘贴的例子,这是不是很实际,但演示如何使用它。

NULLIF可能会给你一个小的负面影响,但我想它应该仍然比子查询更快。

 DECLARE @tbl TABLE ( id [int] NOT NULL, field [varchar](50) NOT NULL) INSERT INTO @tbl (id, field) SELECT 1, 'Manager' UNION SELECT 2, 'Manager' UNION SELECT 3, 'Customer' UNION SELECT 4, 'Boss' UNION SELECT 5, 'Intern' UNION SELECT 6, 'Customer' UNION SELECT 7, 'Customer' UNION SELECT 8, 'Wife' UNION SELECT 9, 'Son' SELECT * FROM @tbl SELECT COUNT(1) AS [total] ,COUNT(1) - COUNT(NULLIF([field], 'Manager')) AS [Managers] ,COUNT(NULLIF([field], 'Manager')) AS [NotManagers] ,(COUNT(1) - COUNT(NULLIF([field], 'Wife'))) + (COUNT(1) - COUNT(NULLIF([field], 'Son'))) AS [Family] FROM @tbl 

评论赞赏:-)

你的意思是这样的:

 SELECT Count(*) FROM YourTable WHERE Position = 'Manager' 

如果是这样,那么你的工作!

 SELECT COUNT(*) FROM bla WHERE Position = 'Manager' 

我想你可以使用一个简单的WHERE子句来select只logging一些logging。

只需添加一个WHERE子句,你就可以走了。

使用这个,你会得到经理人数

 Select Position, count(*) as 'Position Counter' from your_table group by Position