agn*_*zka 363 sql t-sql sql-server
是否可以指定条件Count()?我想只计算在Position列中有"Manager"的行.
我想在count语句中这样做,而不是使用WHERE; 我问的是因为我需要同时统计管理者和其他人SELECT(在这个例子中,对我来说Count(Position = Manager), Count(Position = Other))这样的事情WHERE是没用的.
Guf*_*ffa 629
如果您不能仅使用where子句限制查询本身,则可以使用count聚合仅计算非空值的事实:
select count(case Position when 'Manager' then 1 else null end)
from ...
Run Code Online (Sandbox Code Playgroud)
您也可以sum以类似的方式使用聚合:
select sum(case Position when 'Manager' then 1 else 0 end)
from ...
Run Code Online (Sandbox Code Playgroud)
Red*_*ter 205
假设您不想限制返回的行,因为您也在聚合其他值,您可以这样做:
select count(case when Position = 'Manager' then 1 else null end) as ManagerCount
from ...
Run Code Online (Sandbox Code Playgroud)
假设您在同一列中拥有经理,主管和团队负责人的价值,您可以得到每个人的计数:
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 ...
Run Code Online (Sandbox Code Playgroud)
小智 27
@Guffa的回答非常好,只是指出IF语句可能更清晰
select count(IF(Position = 'Manager', 1, NULL)) as ManagerCount
from ...
Run Code Online (Sandbox Code Playgroud)
Ada*_*Dev 20
取决于你的意思,但另一种意义的解释是你想要计算具有特定值的行,但不想限制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
Run Code Online (Sandbox Code Playgroud)
Mat*_*ted 12
如果您使用的是SQL 2005或更高版本,也可以使用Pivot关键字
SELECT *
FROM @Users
PIVOT (
COUNT(Position)
FOR Position
IN (Manager, CEO, Employee)
) as p
Run Code Online (Sandbox Code Playgroud)
测试数据集
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')
Run Code Online (Sandbox Code Playgroud)
如果使用 Postgres 或 SQLite,您可以使用 Filter 子句来提高可读性:
SELECT
COUNT(1) FILTER (WHERE POSITION = 'Manager') AS ManagerCount,
COUNT(1) FILTER (WHERE POSITION = 'Other') AS OtherCount
FROM ...
Run Code Online (Sandbox Code Playgroud)
BigQuery 也有Countif- 在此处查看对这些功能的不同 SQL 方言的支持:https :
//modern-sql.com/feature/filter
你的意思是这样吗:
SELECT Count(*) FROM YourTable WHERE Position = 'Manager'
Run Code Online (Sandbox Code Playgroud)
如果是这样,那行得通!
我知道这确实很旧,但我喜欢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
Run Code Online (Sandbox Code Playgroud)
感谢评论:-)