Я бы сначала расширил диапазон в список дат, а затем использовал бы следующий запрос:
SELECT SUM(p1.payment_per_day)
FROM dates d
INNER JOIN payments p1 ON p1.starts_from <= d.date
LEFT JOIN payments p2 ON p2.starts_from <= d.date
AND p2.starts_from > p1.starts_from
WHERE p2.id IS NULL
Вы можете получить список из диапазона с помощью таблицы чисел, например:
SELECT DATE_ADD(@date_from, INTERVAL num DAY)
FROM numbers
WHERE num BETWEEN 0 AND DATEDIFF(@date_to, @date_from)
Таблица чисел - вещь, которую стоит иметь, поскольку она может быть полезна во многих ситуациях, поэтому подумайте над тем, чтобы предоставить ее себе. Вот очень простой скрипт для создания и инициализации таблицы чисел:
CREATE TABLE numbers AS SELECT 0 AS num;
SET @ofs = (SELECT COUNT(*) FROM numbers); INSERT INTO numbers SELECT @ofs + num FROM numbers;
SET @ofs = (SELECT COUNT(*) FROM numbers); INSERT INTO numbers SELECT @ofs + num FROM numbers;
SET @ofs = (SELECT COUNT(*) FROM numbers); INSERT INTO numbers SELECT @ofs + num FROM numbers;
… /* repeat as necessary, each line doubles the number of rows in the table */
Но, конечно, вместо этого вы можете использовать цикл.
Вот моя полная среда тестирования на SQL Fiddle (для любого, с кем можно поиграть).