是否可以在Count()中指定一个条件?我希望只计算在Position列中有“Manager”的行。

我想在count语句中做,而不是用WHERE;我正在询问它,因为我需要在相同的SELECT(类似count (Position = Manager), count (Position = Other))中计算经理和其他,所以在这个例子中,WHERE对我来说没有用处。


当前回答

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

SELECT
  COUNT(1) FILTER (WHERE POSITION = 'Manager') AS ManagerCount,
  COUNT(1) FILTER (WHERE POSITION = 'Other') AS OtherCount
FROM ...

BigQuery也有Countif -在这里可以看到不同SQL方言对这些特性的支持: https://modern-sql.com/feature/filter

其他回答

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

我认为您可以使用一个简单的WHERE子句来只选择count some记录。

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

SELECT
  COUNT(1) FILTER (WHERE POSITION = 'Manager') AS ManagerCount,
  COUNT(1) FILTER (WHERE POSITION = 'Other') AS OtherCount
FROM ...

BigQuery也有Countif -在这里可以看到不同SQL方言对这些特性的支持: https://modern-sql.com/feature/filter

如果你不能用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 ...

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

更多信息来自Technet

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