É possível especificar a condição na contagem()?
é possível especificar uma condição em Count()
? Eu gostaria de contar apenas as linhas que têm, por exemplo, "Manager" na coluna de posição.
quero fazê-lo na declaração de contagem, não usando WHERE
; estou a perguntar porque preciso de contar ambos os gerentes e outros no mesmo SELECT
(algo como Count(Position = Manager), Count(Position = Other))
assim WHERE
não é útil para mim neste exemplo.
12 answers
Se você não pode limitar a própria consulta com uma cláusula where
, você pode usar o fato de que o count
agregado só conta os valores não nulos:
select count(case Position when 'Manager' then 1 else null end)
from ...
Também pode utilizar o conjunto sum
de uma forma semelhante:
select sum(case Position when 'Manager' then 1 else 0 end)
from ...
Assumindo que não quer restringir as linhas que são devolvidas porque também está a agregar outros valores, pode fazê-lo assim:
select count(case when Position = 'Manager' then 1 else null end) as ManagerCount
from ...
Digamos que dentro da mesma coluna você tinha valores de gerente, Supervisor e líder de equipe, você poderia obter as contagens de cada um assim:
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 ...
A resposta de@Guffa é excelente, basta assinalar que talvez seja mais limpo com uma declaração IF {[[3]}
select count(IF(Position = 'Manager', 1, NULL)) as ManagerCount
from ...
Depende do que você quer dizer, mas a outra interpretação do significado é onde você quer contar as linhas com um certo valor, mas não quer restringir a seleção apenas a essas linhas...
Você faria isso usando SUM () com uma cláusula em, assim em vez de usar a contagem(): por exemplo
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
Também pode usar a palavra-chave Pivot se estiver a utilizar SQL 2005 ou acima
Mais Informações e de Technet
SELECT *
FROM @Users
PIVOT (
COUNT(Position)
FOR Position
IN (Manager, CEO, Employee)
) as p
Conjunto De Dados De Ensaio
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')
NULLIF
pode dar-lhe um pequeno impacto negativo no desempenho, mas eu acho que ainda deve ser mais rápido do que subqueries.
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
Comentários apreciados: -)
Eu acho que você pode usar uma simples cláusula onde selecionar apenas a contagem de algum registro.
Queres dizer apenas isto:
SELECT Count(*) FROM YourTable WHERE Position = 'Manager'
Se sim, então sim, isso funciona!
SELECT COUNT(*) FROM bla WHERE Position = 'Manager'
Nota com o PrestoDB SQL( do Facebook), existe um atalho:
Https://prestodb.io/docs/current/functions/aggregate.html
Count_if (x) → bigint
Devolve o número de valores de entrada verdadeiros. Presente a função é equivalente à contagem (caso em que x então 1 final)
Select Position, count(*) as 'Position Counter'
from your_table
group by Position