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

时间:2009-09-09 14:28:53

标签: sql sql-server tsql

是否可以在Count()中指定条件?我想只计算在“位置”列中有“管理员”的行。

我想在count语句中执行此操作,而不是使用WHERE;我问的是因为我需要在同一个SELECT中统计管理员和其他人(类似于Count(Position = Manager), Count(Position = Other)),所以WHERE在这个例子中对我没用。

13 个答案:

答案 0 :(得分:583)

如果您不能仅使用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 ...

答案 1 :(得分:200)

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

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

让我们说在同一列中您拥有经理,主管和团队负责人的价值,您可以得到每个人的计数:

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 ...

答案 2 :(得分:22)

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

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

答案 3 :(得分:19)

取决于你的意思,但另一种解释是你希望计算具有特定值的行,但不想将SELECT限制为那些行......

您可以使用带有子句的SUM()来执行此操作,而不是使用COUNT(): e.g。

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

答案 4 :(得分:12)

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

more infoTechnet

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

测试数据集

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')

答案 5 :(得分:3)

我知道这真的很老了,但我喜欢这种情况的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

评论赞赏: - )

答案 6 :(得分:2)

你的意思是这个:

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

如果是的话,那么是的确有效!

答案 7 :(得分:1)

如果使用Postgres或SQLite,则可以使用Filter子句来提高可读性:

fread

BigQuery还具有SELECT COUNT(1) FILTER (WHERE POSITION = 'Manager') AS ManagerCount, COUNT(1) FILTER (WHERE POSITION = 'Other') AS OtherCount FROM ... -有关这些功能的信息,请参见不同SQL方言的支持: enter image description here

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我认为您可以使用简单的WHERE子句来仅选择计数某些记录。

答案 10 :(得分:0)

请注意PrestoDB SQL(来自Facebook),有一个快捷方式:

https://prestodb.io/docs/current/functions/aggregate.html

  

count_if(x)→bigint

     

返回TRUE输入值的数量。这个   函数等于count(CASE WHEN x THEN 1 END)

答案 11 :(得分:0)

这是我要获取的数据集,该数据集包含每个运输集装箱中的总数和符合条件的数量。那让我回答了一个问题:“有多少个运输集装箱中超过51%的物品超过X%”

select
   Schedule,
   PackageNum,
   COUNT (UniqueID) as Total,
   SUM (
   case
      when
         Size > 51 
      then
         1 
      else
         0 
   end
) as NumOverSize 
from
   Inventory 
where
   customer like '%PEPSI%' 
group by
   Schedule, PackageNum

答案 12 :(得分:-6)

使用此功能,您将获得经理人的计数

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