Обычное решение этого вопроса заключается в создании календарной таблицы . Это таблица, в которой хранятся все возможные даты, с которыми ваш запрос должен иметь дело. В дикой природе доступны решения для создания и заполнения таблицы, например, вы можете взглянуть на этот пост SO .
Итак, давайте предположим таблицу со следующей структурой и данными:
CREATE TABLE all_dates as (my_date DATE PRIMARY KEY);
INSERT INTO all_dates VALUES
('12-10-2019'),
('13-10-2019'),
('14-10-2019'),
...
;
Теперь ваш вопрос можно решить, просто соединив вашу таблицу с таблицей календаря и агрегировав результаты, следующим образом:
SELECT r.rent_id, d.my_date `day`, SUM(amount) amount
FROM all_dates d
INNER JOIN rentals r ON d.my_date BETWEEN r.start_date AND r.end_date
GROUP BY r.rent_id, d.my_date
Примечание: ваше намерение для получения id
столбец неясен. Похоже, вы готовы создать новый уникальный идентификатор. Если это так, один из вариантов будет использовать ROW_NUMBER()
, как показано ниже:
SELECT ROW_NUMBER() OVER(ORDER BY rent_id, `day`) id, x.*
FROM (
SELECT r.rent_id, d.my_date `day`, SUM(amount) amount
FROM all_dates d
INNER JOIN rentals r ON d.my_date BETWEEN r.start_date AND r.end_date
GROUP BY r.rent_id, d.my_date
) x