Me pregunto cómo escribir esta consulta.
Sé que esta sintaxis real es falsa, pero te ayudará a entender lo que quiero. Lo necesito en este formato, porque es parte de una consulta mucho más grande.
SELECT distributor_id,
COUNT(*) AS TOTAL,
COUNT(*) WHERE level = 'exec',
COUNT(*) WHERE level = 'personal'
Necesito todo esto devuelto en una consulta.
Además, debe estar en una fila, por lo que lo siguiente no funcionará:
'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'
Respuestas:
Puede usar una
CASE
declaración con una función agregada. Esto es básicamente lo mismo que unaPIVOT
función en algunos RDBMS:fuente
COUNT
contarádistributor_id
sabiamente. No todas las filas de la tabla, ¿verdad?Una forma que funciona con seguridad
EDITAR:
Vea el desglose del rendimiento de @ KevinBalmforth para saber por qué es probable que no desee utilizar este método y, en su lugar, deba optar por la respuesta de @ Taryn ♦. Dejo esto para que la gente pueda entender sus opciones.
fuente
sum(case...)
se debe considerar la solución.group by
con el beneficio de reemplazar una consulta anidada completa con una simplecount(*)
como muestra @Mihai, con más simplificaciones de sintaxis solo de MySQL.COUNT
solo cuentanon null
valores yDECODE
devolverá un valor no nulo1
solo si se cumple su condición.fuente
distributor_id
será el espectáculo consulta? Muestra 1 fila en total.Sobre la base de otras respuestas publicadas.
Ambos producirán los valores correctos:
Sin embargo, el rendimiento es bastante diferente, lo que obviamente será más relevante a medida que aumente la cantidad de datos.
Descubrí que, suponiendo que no se definieran índices en la tabla, la consulta que usa los SUMs haría un escaneo de una sola tabla, mientras que la consulta con los COUNT haría múltiples escaneos de la tabla.
Como ejemplo, ejecute el siguiente script:
Resalte las 2 declaraciones SELECT y haga clic en el icono Mostrar plan de ejecución estimado. Verá que la primera instrucción hará un escaneo de tabla y la segunda hará 4. Obviamente, un escaneo de tabla es mejor que 4.
Agregar un índice agrupado también es interesante. P.ej
El primer SELECT anterior hará un solo escaneo de índice agrupado. El segundo SELECT realizará 4 búsquedas de índice agrupado, pero aún son más caras que un solo escaneo de índice agrupado. Intenté lo mismo en una mesa con 8 millones de filas y el segundo SELECT todavía era mucho más caro.
fuente
Para MySQL, esto se puede acortar a:
fuente
Bueno, si debe tenerlo todo en una consulta, podría hacer una unión:
O, si puede hacerlo después del procesamiento:
Obtendrá el recuento de cada nivel y deberá sumarlos todos para obtener el total.
fuente
UNION
que es muy útil al generar un informe que contiene varias instancias de laCOUNT(*)
función.#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') FROM distributors UNION SELECT COUNT() AS EXEC_COUNT FROM distributors WHERE ' at line 1
.Hago algo como esto donde solo le doy a cada tabla un nombre de cadena para identificarlo en la columna A, y un recuento para la columna. Luego los uní a todos para que se apilen. El resultado es bastante en mi opinión: no estoy seguro de cuán eficiente es en comparación con otras opciones, pero me dio lo que necesitaba.
Resultado:
fuente
a query that I created makes ...
- ¿Dónde está esa consulta?Basado en la respuesta aceptada de Bluefeet con un matiz adicional usando
OVER()
:Usar
OVER()
sin nada en () le dará el recuento total de todo el conjunto de datos.fuente
Creo que esto también puede funcionar para ti
select count(*) as anc,(select count(*) from Patient where sex='F')as patientF,(select count(*) from Patient where sex='M') as patientM from anc
y también puede seleccionar y contar tablas relacionadas como esta
select count(*) as anc,(select count(*) from Patient where Patient.Id=anc.PatientId)as patientF,(select count(*) from Patient where sex='M') as patientM from anc
fuente