是否可以在Count()
中指定条件?我想只计算在“位置”列中有“管理员”的行。
我想在count语句中执行此操作,而不是使用WHERE
;我问的是因为我需要在同一个SELECT
中统计管理员和其他人(类似于Count(Position = Manager), Count(Position = Other))
,所以WHERE
在这个例子中对我没用。
答案 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关键字
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方言的支持:
答案 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