是否有可能在count指定条件()?(Is it possible to specify condi

2019-07-17 12:17发布

是否可以在指定的条件Count() 我想只计算有,例如,“经理人”的位置列的行。

我想这样做在count语句,不使用WHERE ; 我问这个问题,因为我需要在同一个计数管理人员和其他SELECT (像Count(Position = Manager), Count(Position = Other))所以WHERE在这个例子中没有用我。

Answer 1:

如果你不能只是限制查询本身就带有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 ...


Answer 2:

假设你不希望限制被返回,因为你是聚合其它值,你可以做这样的行:

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


Answer 3:

@Guffa的答案是优秀的,只是指出,也许是一个IF语句清洁

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


Answer 4:

取决于你的意思,但含义的其他解释是要算具有一定值的行,但不希望将限制SELECT只是那些行...

你会用它做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


Answer 5:

如果您使用的是SQL 2005或以上,您还可以使用数据透视关键字

更多信息 ,并从的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')


Answer 6:

我知道这是真的老了,但我喜欢的NULLIF这样的场景把戏,我没有发现任何缺点为止。 只是看到我的副本和pasteable例子,这是不是很实用,虽然,但演示了如何使用它。

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

评论赞赏:-)



Answer 7:

你的意思只是这样的:

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

如果是这样,那么烨的作品!



Answer 8:

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


Answer 9:

我想你可以使用一个简单的WHERE子句只选择计数的一些记录。



Answer 10:

注意与PrestoDB SQL(来自Facebook),有一个捷径:

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

count_if(X)→BIGINT

返回TRUE输入值的数目。 此功能是等效的计数(CASE WHEN X,则1 END)



Answer 11:

使用此你会得到管理者的计数

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


文章来源: Is it possible to specify condition in Count()?