Como contar e recuperar nulos e não nulos na mesma coluna no MySQL?
minha 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>) contará apenas não nulos. Se você adicionar outro nível de aninhamento, count_not_visited pode ser determinado como:count_registered - count_visited
Para contar todos os valores não nulos de uma coluna, digamos
col1
, você pode apenas usarcount(col1) as cnt_col1
. Mas, para ser mais óbvio, você pode usar asum()
função e oIS NOT NULL
operador devirsum(col1 IS NOT NULL)
. IssoIS NOT NULL
ocorre porque o operador retorna um int: 1 para true e 0 para false.Para contar valores nulos, você pode usar o
IS NULL
operador, que retorna 1 quando o valor nulo. Como antes, com osum()
operador.Dado que, para obter o cadastro, a visitação e a não visitação de cada mês, é isso que você pode fazer:
Observe que você pode exibir a coluna 'não visitado' com o espaço, apenas citando, citando duas vezes ou usando backticks (`).
Outra abordagem para selecionar e agrupar por mês seria concatenar mês com ano, assim
concat(month(registDate), '-', date(registDate))
. Mas é menos elegante.O
case
operador proposto em outras respostas é perfeitamente válido, mas acho mais adequado para outras situações. E é mais detalhado.fonte