SQL для суммирования заказов между диапазонами дат - PullRequest
0 голосов
/ 04 марта 2019

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

| ID | START_DATETIME      | END_DATETIME        | QUANTITY |
+-----------------------------------------------------------+
| 1  | 2019-03-01 12:00:00 | 2019-03-04 12:00:00 |     3    |
| 2  | 2019-03-02 12:00:00 | 2019-03-03 12:00:00 |     1    |
| 3  | 2019-03-03 12:00:00 | 2019-03-04 12:00:00 |     1    |
| 4  | 2019-03-04 12:00:00 | 2019-03-05 12:00:00 |     2    |

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

Вотпример заданного диапазона дат:

2019-03-01 to 2019-03-06

Вот ожидаемый результат:

| DATE        | QUANTITY | 
+------------------------+
| 2019-03-01  |     3    |
| 2019-03-02  |     4    |
| 2019-03-03  |     5    |
| 2019-03-04  |     6    |
| 2019-03-05  |     2    |
| 2019-03-06  |     0    |

Вот объяснение того, как должен быть рассчитан результат:

  • 2019-03-01 - сумма бронирования 1 количество
  • 2019-03-02 - сумма бронирования 1 и 2 количество
  • 2019-03-03 - сумма бронирования1 и 2 и 3 количество
  • 2019-03-04 - сумма бронирования 1 и 3 и 4 количество
  • 2019-03-05 - сумма бронирования 4 количество
  • 2019-03-06 не имеет заказов

Я пробовал различные типы операторов SQL и просто не могу их взломать.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Самая большая проблема - это создание дат.В MySQL 8+ вы можете использовать рекурсивный CTE.В противном случае просто перечислите значения:

select d.dte,
       (select sum(b.quantity)
        from bookings b
        where b.start_datetime <= d.dte + interval 1 day and
              b.end_datetime >= d.dte
       ) as quantity
from ((select date('2019-03-01') as dte union all
      (select date('2019-03-02') as dte union all
      (select date('2019-03-03') as dte union all
      (select date('2019-03-04') as dte union all
      (select date('2019-03-05') as dte union all
      (select date('2019-03-06') as dte 
     ) d;

Это будет достаточно хорошо для нескольких дат.Если у вас большее число, порекомендуйте таблицу календаря или таблицу чисел.

0 голосов
/ 04 марта 2019

Хотя вы ищете решение в MySql, я предоставляю вам код, который делает то же самое в SQL Server, надеясь, что это поможет:

WITH Dates AS (
        SELECT
         [Date] = CONVERT(DATETIME,'2019-03-01')
        UNION ALL
        SELECT
         [Date] = DATEADD(DAY, 1, [Date])
        FROM
         Dates
        WHERE
         Date < '2019-03-06'
)



  Select cast(d.Date as date), IsNull(Sum(b.QUANTITY), 0) 
   from Dates d left join Bookings b
   on
    d.Date >= cast(b.START_DATETIME as date) 
    and  
    d.Date <= cast(b.END_DATETIME as date)
   group by d.Date

Как видно, сначала вам нужно генерирует диапазон дат , затем объединяет его с таблицей Bookings и, наконец, используя Group By, вы получаете сумму количеств для каждой даты.

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