Обновление
Поскольку используемая версия SQLite слишком рано для поддержки оконных функций, другой способ сделать это - LEFT JOIN
таблица transactions
сама по себе, требующая Значение id
в объединенной таблице должно быть ниже. Значения due
и bill
из объединенной таблицы могут затем суммироваться для получения значений opening
и closing
:
SELECT t1.trx_date,
COALESCE(SUM(t2.bill)-SUM(t2.due), 0) AS opening,
t1.bill,
t1.due,
COALESCE(SUM(t2.bill)-SUM(t2.due), 0) + t1.bill - t1.due AS closing
FROM transactions t1
LEFT JOIN transactions t2 ON t2.id < t1.id
GROUP BY t1.id
Выход:
trx_date bill due opening closing
2020-03-01 100 10 0 90
2020-03-02 50 20 90 120
2020-03-02 100 0 120 220
2020-03-03 200 20 220 400
2020-03-04 110 10 400 500
Демонстрация на dbfiddle
Обратите внимание, что этот запрос также будет выполняться на MySQL.
Исходный ответ
SQLite поддерживает окно функции, что делает этот запрос намного проще:
SELECT trx_date,
COALESCE(SUM(bill-due) OVER (ORDER BY trx_date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) AS opening,
bill,
due,
SUM(bill-due) OVER (ORDER BY trx_date) AS closing
FROM transactions
Вывод:
trx_date opening bill due closing
2020-03-01 0 100 10 90
2020-03-02 90 50 20 220
2020-03-02 120 100 0 220
2020-03-03 220 200 20 400
2020-03-04 400 110 10 500
Демонстрация на dbfiddle
Обратите внимание, что когда у вас есть несколько транзакций для данного trx_date
вы получите одинаковое значение closing
для всех из них. Это можно обойти, если у вас есть другой столбец заказа, который имеет уникальные значения. Смотрите, например, demo , в котором используется столбец id
.