¿Es posible especificar una condición en Count()?

Resuelto agnieszka asked hace 15 años • 13 respuestas

¿Es posible especificar una condición en Count()? Me gustaría contar sólo las filas que tienen, por ejemplo, "Administrador" en la columna Posición.

Quiero hacerlo en la declaración de conteo, sin usar WHERE; Lo pregunto porque necesito contar tanto a los Gerentes como a Otros en el mismo SELECT(algo así Count(Position = Manager), Count(Position = Other))no WHEREme sirve en este ejemplo).

agnieszka avatar Sep 09 '09 21:09 agnieszka
Aceptado

Si no puede simplemente limitar la consulta con una wherecláusula, puede utilizar el hecho de que el countagregado solo cuenta los valores no nulos:

select count(case Position when 'Manager' then 1 else null end)
from ...

También puedes utilizar el sumagregado de forma similar:

select sum(case Position when 'Manager' then 1 else 0 end)
from ...
Guffa avatar Sep 09 '2009 14:09 Guffa

Suponiendo que no desea restringir las filas que se devuelven porque también está agregando otros valores, puede hacerlo así:

select count(case when Position = 'Manager' then 1 else null end) as ManagerCount
from ...

Digamos que dentro de la misma columna tienes los valores de Gerente, Supervisor y Líder de equipo, podrías obtener los recuentos de cada uno de esta manera:

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 ...
D'Arcy Rittich avatar Sep 09 '2009 14:09 D'Arcy Rittich

La respuesta de @Guffa es excelente, solo señale que tal vez sea más limpio con una declaración IF

select count(IIF(Position = 'Manager', 1, NULL)) as ManagerCount
from ...
Hivenfour avatar May 20 '2016 10:05 Hivenfour

Depende de lo que quieras decir, pero la otra interpretación del significado es cuando quieres contar filas con un valor determinado, pero no quieres restringir SELECTSÓLO esas filas...

Lo harías usando SUM()una cláusula en, como esta en lugar de usar COUNT(): por ejemplo

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
AdaTheDev avatar Sep 09 '2009 14:09 AdaTheDev