filas - sql count group by
¿Es posible especificar la condición en Count()? (12)
¿Te refieres a esto?
SELECT Count(*) FROM YourTable WHERE Position = ''Manager''
Si es así, entonces sí que funciona!
¿Es posible especificar una condición en Count()
? Me gustaría contar solo las filas que tienen, por ejemplo, "Administrador" en la columna Posición.
Quiero hacerlo en el estado de cuenta, sin usar WHERE
; Lo pregunto porque necesito contar tanto a los Administradores como a Otros en el mismo SELECT
(algo como Count(Position = Manager), Count(Position = Other))
por lo que WHERE
no es útil para mí en este ejemplo.
Creo que puede usar una simple cláusula WHERE para seleccionar solo el registro de recuento.
Depende de lo que quiere decir, pero la otra interpretación del significado es donde desea contar las filas con un cierto valor, pero no desea restringir el SELECCIONAR para JUSTAR esas filas ...
Lo harías usando SUM () con una cláusula como, 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
La respuesta de @Guffa es excelente, solo señale que quizás esté más limpio con una declaración IF
select count(IF(Position = ''Manager'', 1, NULL)) as ManagerCount
from ...
Nota con PrestoDB SQL (desde Facebook), hay un acceso directo:
https://prestodb.io/docs/current/functions/aggregate.html
count_if (x) → bigint
Devuelve el número de valores de entrada VERDADERO. Esta función es equivalente a contar (CASO CUANDO x ENTONCES 1 FIN)
Sé que esto es realmente viejo, pero me gusta el truco de NULLIF
para tales escenarios, y hasta ahora no he encontrado inconvenientes. Solo vea mi copia y ejemplo que se puede pegar, lo cual no es muy práctico, pero demuestra cómo usarlo.
NULLIF
puede darle un pequeño impacto negativo en el rendimiento, pero creo que todavía debería ser más rápido que las subconsultas.
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
Comentarios apreciados :-)
Si no puede limitar la consulta con una cláusula where
, puede usar el hecho de que el agregado de count
solo cuenta los valores no nulos:
select count(case Position when ''Manager'' then 1 else null end)
from ...
También puede utilizar la sum
agregada de una manera similar:
select sum(case Position when ''Manager'' then 1 else 0 end)
from ...
Simplemente agrega una cláusula WHERE
y listo.
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 que tenía los valores de Gerente, Supervisor y Líder de equipo, podría obtener los conteos de cada uno de los siguientes:
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 ...
También puede utilizar la palabra clave de Pivot si está utilizando SQL 2005 o superior
Más información y de Technet
SELECT *
FROM @Users
PIVOT (
COUNT(Position)
FOR Position
IN (Manager, CEO, Employee)
) as p
Conjunto de datos de prueba
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'')
Usando esto obtendrás el conteo para los gerentes.
Select Position, count(*) as ''Position Counter''
from your_table
group by Position
SELECT COUNT(*) FROM bla WHERE Position = ''Manager''