是否可以在中指定条件Count()
?我只想计算“位置”列中具有“管理器”的行。
我想在count语句中执行此操作,而不要使用WHERE
; 我问这个问题,因为我需要计算两个经理和其他在同一个SELECT
(像Count(Position = Manager), Count(Position = Other))
这样WHERE
在这个例子中没有用我。
SELECT *
,而是SELECT COUNT(*)
,这是完全不同的野兽。
是否可以在中指定条件Count()
?我只想计算“位置”列中具有“管理器”的行。
我想在count语句中执行此操作,而不要使用WHERE
; 我问这个问题,因为我需要计算两个经理和其他在同一个SELECT
(像Count(Position = Manager), Count(Position = Other))
这样WHERE
在这个例子中没有用我。
SELECT *
,而是SELECT COUNT(*)
,这是完全不同的野兽。
Answers:
如果您不能只使用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 ...
null
很特别。用途case when IntegerField is null then ...
SUM(CONVERT(int, IsManager))
else null
for case
语句,因此该count()
示例可以短10个字符(如果计算空格)。
假设您也不想因为聚合其他值而限制返回的行,则可以这样操作:
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 ...
else
部分,只需end
在1
。之后。
else
,因为它可以更好地记录case语句的结果,尤其是对于novie SQL开发人员而言。为简便起见,在这种情况下可以将其删除。
如果您使用的是SQL 2005或更高版本,则也可以使用数据透视关键字
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')
你是说这个意思吗?
SELECT Count(*) FROM YourTable WHERE Position = 'Manager'
如果是这样,那么就可以了!
我知道这确实很老,但是我喜欢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
评论赞赏:-)
请注意,对于PrestoDB SQL(来自Facebook),有一个快捷方式:
https://prestodb.io/docs/current/functions/aggregate.html
count_if(x)→bigint
返回TRUE输入值的数量。此功能等效于count(CASE WHEN x THEN 1 END)