¿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_visitedPara 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 NULLoperador, convirtiéndosesum(col1 IS NOT NULL). Esto se debe a que elIS NOT NULLoperador devuelve un int: 1 para verdadero y 0 para falso.Para contar valores nulos, puede usar el
IS NULLoperador, 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
caseoperador propuesto en otras respuestas es perfectamente válido, pero creo que es más adecuado para otras situaciones. Y es más detallado.fuente