¿Cómo contar y recuperar nulo y no nulo en la misma columna en MySQL?
mi mesa
---------------------------------------------------
id | name | visited | registDate |
---------------------------------------------------
1 | george | NULL | 2014-04-01 |
---------------------------------------------------
2 | Thomas | NULL | 2014-04-15 |
---------------------------------------------------
3 | Wilfred | 1 | 2014-04-24 |
---------------------------------------------------
4 | paul | 1 | 2014-04-10 |
---------------------------------------------------
5 | elina | NULL | 2014-05-03 |
---------------------------------------------------
6 | angela | NULL | 2014-04-13 |
---------------------------------------------------
7 | elina | 1 | 2014-05-18 |
---------------------------------------------------
Resultado Esperado
month register visited not visited
---------------------------------------------
05-2014 2 1 1
---------------------------------------------
04-2014 5 2 3
---------------------------------------------
count(visited)
. count (<column>) solo contará no es nulo. Si agrega otro nivel de anidamiento, count_not_visited se puede determinar comocount_registered - count_visited
Para contar todos los valores no nulos para una columna, por ejemplo
col1
, solo puede usarcount(col1) as cnt_col1
. Pero, para ser más obvio, puede usar lasum()
función y elIS NOT NULL
operador, convirtiéndosesum(col1 IS NOT NULL)
. Esto se debe a que elIS NOT NULL
operador devuelve un int: 1 para verdadero y 0 para falso.Para contar valores nulos, puede usar el
IS NULL
operador, que devuelve 1 cuando el valor es nulo. Como antes, con elsum()
operador.Dado que, para obtener lo registrado, visitado y no visitado por cada mes, esto es lo que puede hacer:
Tenga en cuenta que puede generar la columna 'no visitado' con el espacio, simplemente citando, citando dos veces o usando las teclas de retroceso (`).
Otro enfoque para seleccionar y agrupar por mes sería concatenar mes con año, como este
concat(month(registDate), '-', date(registDate))
. Pero es menos elegante.El
case
operador propuesto en otras respuestas es perfectamente válido, pero creo que es más adecuado para otras situaciones. Y es más detallado.fuente