Как получить нулевой счет для пропущенных дат в mysql сгруппировать по выражению - PullRequest
0 голосов
/ 16 января 2020

У меня есть таблица mysql, из которой мне нужно узнать, сколько записей создано в день за последние 30 дней.

Простой запрос для этого похож на

select count(*) from table_name where date(created) > yyyymmdd group by date(created) order by date(created)

Мне не нужно здесь выбирать дату, только счет.

Так что я ожидаю 30 строк здесь. Но проблема здесь в том, что если в какой-то день не будет создано ни одной записи, она не появится в результате, и у меня будет менее 30 строк.

Есть ли другой способ вывести ноль (0) счетчиков? для дат, когда записи не создаются?

текущий вывод:

+---------------+----------+
| date(created) | count(*) |
+---------------+----------+
| 2019-12-20    |     1504 |
| 2019-12-29    |       12 |
+---------------+----------+

Ожидаемый вывод:

+---------------+----------+
| date(created) | count(*) |
+---------------+----------+
| 2019-12-20    |     1504 |
| 2019-12-21    |        0 |
| 2019-12-22    |        0 |
| 2019-12-23    |        0 |
| 2019-12-24    |        0 |
| 2019-12-25    |        0 |
| 2019-12-26    |        0 |
| 2019-12-27    |        0 |
| 2019-12-28    |        0 |
| 2019-12-29    |       12 |
+---------------+----------+

Ответы [ 2 ]

1 голос
/ 18 января 2020

вы можете использовать следующим образом:


SET @date_min = '2019-12-20';
SET @date_max = '2019-12-29';

SELECT
   date_generator.date as the_date,
   IFNULL(COUNT(table_name.id), 0) as count
from (
   select DATE_ADD(@date_min, INTERVAL (@i:=@i+1)-1 DAY) as `date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max
) date_generator
left join `table_name` on DATE(created) = date_generator.date
GROUP BY date;

, поэтому здесь я создаю временную таблицу date_generator будет располагать даты между заданным диапазоном дат и присоединяться к вашей основной таблице (транзакции).

вывод как положено:

+---------------+----------+
| the_date      | count    |
+---------------+----------+
| 2019-12-20    |     1504 |
| 2019-12-21    |        0 |
| 2019-12-22    |        0 |
| 2019-12-23    |        0 |
| 2019-12-24    |        0 |
| 2019-12-25    |        0 |
| 2019-12-26    |        0 |
| 2019-12-27    |        0 |
| 2019-12-28    |        0 |
| 2019-12-29    |       12 |
+---------------+----------+
0 голосов
/ 16 января 2020

Тест:

WITH RECURSIVE
cte AS ( SELECT @yyyymmdd + INTERVAL 1 DAY dateCreated 
         UNION ALL
         SELECT dateCreated + INTERVAL 1 DAY
         FROM cte
         WHERE dateCreated < ( SELECT MAX(DATE(created))
                               FROM table_name ) )
SELECT COUNT(table_name.created) 
FROM cte
JOIN table_name ON DATE(table_name.created) = cte.dateCreated 
GROUP BY cte.dateCreated 
ORDER BY cte.dateCreated 

@yyyymmdd - это переменная или заполнитель, где должно быть указано значение из условия вашего запроса (where date(created) > yyyymmdd).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...