SQL возвращает 0, если число == 0 - PullRequest
0 голосов
/ 13 мая 2018

Я хочу получить все подсчеты между двумя датами в Mysql, но когда в конкретную дату не существует значения, результат SQL не возвращает ни одного.Но я хочу вернуть 0.

    SELECT
    DATE(`date`) AS RegistrationDate,   COUNT(`id`) AS NumberOfRegistrations
 FROM
    Users
 WHERE
    `date` between "2018/05/1" and "2018/05/13"
 GROUP BY
    RegistrationDate

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Если у вас есть таблица календаря, то ваша проблема решена:

SELECT DATE(`date`) AS RegistrationDate, COUNT(u.id) AS NumberOfRegistrations
FROM Calendar c LEFT JOIN
     Users u
     ON DATE(u.date) = c.date
WHERE c.date >= '2018-05-01' AND c.date < '2018-05-14'
GROUP BY RegistrationDate;

Таблица Calendar может быть очень полезна, и вы можете найти ее с помощью поиска Google.

Вы можете сделать что-то похожее с таблицей numbers, если у вас есть один удобный.

Если их нет, вы можете сгенерировать нужные даты:

SELECT DATE(`date`) AS RegistrationDate, COUNT(u.id) AS NumberOfRegistrations
FROM (SELECT DATE('2018-05-01') as dte UNION ALL
             DATE('2018-05-02') as dte UNION ALL
             DATE('2018-05-03') as dte UNION ALL
             DATE('2018-05-04') as dte UNION ALL
             DATE('2018-05-05') as dte UNION ALL
             DATE('2018-05-06') as dte UNION ALL
             DATE('2018-05-07') as dte UNION ALL
             DATE('2018-05-08') as dte UNION ALL
             DATE('2018-05-09') as dte UNION ALL
             DATE('2018-05-10') as dte UNION ALL
             DATE('2018-05-11') as dte UNION ALL
             DATE('2018-05-12') as dte UNION ALL
             DATE('2018-05-13') as dte UNION ALL
             DATE('2018-05-14') as dte
     ) c LEFT JOIN
     Users u
     ON DATE(u.date) = c.dte
WHERE c.dte >= '2018-05-01' AND c.dte < '2018-05-14'
GROUP BY RegistrationDate;

Примечания:

  • Использовать стандартные форматы даты для дат ГГГГ-ММ-ДД.
  • Стандартным разделителем строк в SQL является одинарная кавычка. Используйте его, если у вас нет веских причин использовать двойные кавычки.
  • Не используйте between с датами. Неясно, намереваетесь ли вы включить 2018-05-13, но ваш запрос, вероятно, исключит любые данные на эту дату (из-за компонента времени).
0 голосов
/ 13 мая 2018

Как и в моем комментарии, вот мой подход к вашей проблеме.
(возможны и другие способы)

Первая таблица в объединении создает диапазон дат.

SELECT
  DATE(`gen_date`) AS RegistrationDate, 
  COUNT(`id`) AS NumberOfRegistrations 
FROM 
  (
    SELECT * 
    FROM
      (SELECT adddate('1970-01-01', t4 * 10000 + t3 * 1000 + t2 * 100 + t1 * 10 + t0) gen_date 
        FROM 
          (select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, 
          (select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9)  t1, 
          (select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9)  t2,  
          (select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9)  t3, 
          (select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9)  t4
      ) v 
    WHERE 
      gen_date BETWEEN "2018-05-01" AND "2018-05-13"
  ) d 
LEFT OUTER JOIN users u ON Date(`gen_date`) = Date(`date`)
GROUP BY
  gen_date

Посмотрите, как работает здесь , Обновлено

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