Проблема с отображением фильтра данных по дате в MySQL

У меня есть таблица Заказ:

id    total_amount       date_order 
1        12.000          2018-09-01
2        10.000          2018-09-01
3         5.000          2018-09-03
4         2.000          2018-09-05

У меня есть группа данных запроса SUM по дате:

select SUM(total_amount) as 'total', DATE(date_order) as 'date'
from Order
where date_order >= '2018-09-01' and date_order <= '2018-09-06'
group by (date_order)

Это показывает:

   total           date       
  22.000        2018-09-01      
   5.000        2018-09-03   
   2.000        2018-09-05      

Поскольку данные в 2018-09-02 и 2018-09-04 не имеют данных, они не отображаются в результате. Но я хочу, чтобы запрос отображал таблицу с ожидаемым результатом:

   total           date       
  22.000        2018-09-01    
       0        2018-09-02      
   5.000        2018-09-03
       0        2018-09-04   
   2.000        2018-09-05  

Каждый может помочь мне написать запрос, чтобы показать ожидаемый результат?

внешнее присоединение к справочной таблице календаря

jarlh 04.09.2018 15:44

это не то, как работает group by. Он не может группироваться по несуществующим вещам. Как ему узнать, какие будут отсутствующие значения? Чтобы получить то, что вы хотите, вам нужно создать отдельную таблицу со всеми возможными датами в ней и присоединиться к ней, как упоминалось выше. SQL не имеет внутреннего понимания календарей.

ADyson 04.09.2018 15:46
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

создать дату и присоединиться к таблице заказов

    select SUM(O.total_amount) as total, DATE(gen_date) as oreder_date
        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-09-01' and '2018-09-30'
        ) as t1 left join `Order` O on t1.gen_date= DATE(O.date_order)

where gen_date >= '2018-09-01' and gen_date <= '2018-09-06'
         group by oreder_date

Создайте еще один стол, чтобы присоединиться к нему.

Это может быть таблица дат, например все даты с 01.01.2000 по 31.12.2099 ...

SELECT
  dt.`date`,
  SUM(total_amount) as `total`
FROM
  yourDatesTable     AS dt
LEFT JOIN
  Order              AS o
    ON  o.`date_order` = dt.`date`
WHERE
      dt.`date` >= '2018-09-01'
  AND dt.`date` <  '2018-09-08'
GROUP BY
  dt.`date`
ORDER BY
  dt.`date`

Или это может быть таблица чисел со значениями от -1023 до +1024 (или другой полезный диапазон) ...

SELECT
  n.id,
  '2018-09-01' + INTERVAL n.id DAYS,
  SUM(total_amount) as `total`
FROM
  yourNumbersTable   AS n
LEFT JOIN
  Order              AS o
    ON  o.`date_order` = '2018-09-01' + INTERVAL n.id DAYS
WHERE
      n.id >= 0
  AND n.id <  8
GROUP BY
  n.id
ORDER BY
  n.id

Другие вопросы по теме