Подсчет нулевых и ненулевых значений в столбце


10

Как посчитать и получить значение NULL, а не NULL для одного столбца в MySQL?

туЬаЫе

---------------------------------------------------
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 |
---------------------------------------------------

Ожидаемый результат

month      register    visited    not visited
---------------------------------------------
05-2014       2           1          1   
---------------------------------------------
04-2014       5           2          3
---------------------------------------------

Ответы:


6

Пытаться

SELECT 
   DATE_FORMAT(registDate, '%m-%Y') AS month,
   COUNT(name) AS register,
   SUM(!ISNULL(visited)) AS visited,
   SUM(ISNULL(visited)) AS not_visited
FROM mytable
GROUP BY DATE_FORMAT(registDate, '%m-%Y');

Не нужно создавать еще один столбец.


2

Первое, что нужно сделать, это добавить столбец за месяц:

select *, date_format(registDate, '%Y-%m') as regist_month
from mytable

Тогда вы можете получить все счета:

select
  regist_month
, count(registDate) as count_registered
, sum(case when visited is not null then 1 else 0 end) as count_visited
, sum(case when visited is null then 1 else 0 end) as count_not_visited
from (
  select *, date_format(registDate, '%Y-%m') as regist_month
  from mytable
) group by regist_month

Вы можете использовать подсчет вместо суммы и сократить Выражение немного: count(visited). count (<столбец>) будет считать только не ноль. Если добавить еще один уровень вложенности, count_not_visited можно определить какcount_registered - count_visited
Леннарт

1

Для подсчета всех ненулевых значений для столбца, скажем col1, вы можете просто использовать count(col1) as cnt_col1. Но, чтобы быть более очевидным, вы можете использовать sum()функцию и IS NOT NULLоператор, став sum(col1 IS NOT NULL). Это потому, что IS NOT NULLоператор возвращает int: 1 для true и 0 для false.

Для подсчета нулевых значений вы можете использовать IS NULLоператор, который возвращает 1, когда значение нулевое. Как и раньше, с sum()оператором.

Учитывая, что для того, чтобы регистрироваться, посещать и не посещать каждый месяц, вот что вы можете сделать:

SELECT
date_format(registDate, '%m-%Y') as month,
count(registDate) as register,
sum(visited is not null) as visited,
sum(visited is null) as 'not visited'
GROUP BY
date_format(registDate, '%m-%Y')

Обратите внимание, что вы можете вывести «не посещенный» столбец с пробелом, просто заключив в кавычки, двойные кавычки или используя обратные галочки (`).

Другой подход к выбору и группировке по месяцам состоит в том, чтобы соединять месяц с годом, как это concat(month(registDate), '-', date(registDate)). Но это менее элегантно.

caseОператор , предложенный в других ответах вполне допустим, но я думаю , что более адекватным для других ситуаций. И это более многословно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.