Обычно даты генерируются с помощью рекурсивного запроса, а затем используются оконные функции.
Вы не указываете, какую базу данных используете. Точный синтаксис рекурсивных запросов и художественные оформления даты различаются у разных поставщиков, но вот как это будет выглядеть:
with recursive all_dates (dt, max_dt) as (
select min(date) dt, max(date) max_dt from mytable
union all
select dt + interval '1' day, max_dt from all_dates where dt < max_dt
)
select d.dt, sum(t.amount) over(order by c.dt) amount
from all_dates d
left join mytable t on t.date = d.dt
order by d.dt