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

Author: Michael, 2009-09-09

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 ...
 508
Author: Guffa, 2009-09-09 14:34:49

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 ...
 192
Author: RedFilter, 2009-09-09 14:31:33

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 ...
 17
Author: Hivenfour, 2016-05-20 10:19:44

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
 15
Author: AdaTheDev, 2009-09-09 14:33:09

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')
 12
Author: Matthew Whited, 2009-09-09 15:03:04
Eu sei que isto é muito antigo, mas gosto do truque para esses cenários, e não encontrei desvantagens até agora. Basta ver o meu exemplo copy & pasteable, que não é muito prático, mas demonstra como usá-lo.

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: -)

 3
Author: z00l, 2016-02-12 17:39:21

Eu acho que você pode usar uma simples cláusula onde selecionar apenas a contagem de algum registro.

 1
Author: NawaMan, 2009-09-09 14:30:14

Queres dizer apenas isto:

SELECT Count(*) FROM YourTable WHERE Position = 'Manager'
Se sim, então sim, isso funciona!
 1
Author: Dana, 2009-09-09 14:30:19
SELECT COUNT(*) FROM bla WHERE Position = 'Manager'
 0
Author: Peter, 2009-09-09 14:30:06

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)

 0
Author: Thomas Decaux, 2017-12-11 14:10:08
Basta adicionar uma cláusula e pode ir.
 -3
Author: Kyle Rozendo, 2009-09-09 14:30:01
Se usares isto, terás a contagem dos gerentes.
Select Position, count(*) as 'Position Counter'
from your_table 
group by Position 
 -6
Author: Rafael, 2015-03-18 15:03:33