SQLite: погашение аванса


Автор: Artix (user.su)

Задачка:

Есть таблица, в которой заведены платежи двух типов:
1) аванс (один где-то в начале) и 2) погашение (много)
Нужно построить таблицу, отсортированную по дате, 
в которую добавить столбец "Баланс", который будет уменьшаться
по мере погашения аванса.

Решение:

Исходная табличка с данными:

SELECT PAY_DATE, PAY_PAYTYPE, PAY_SUM FROM PAYMENTS

Промежуточная табличка с балансом

SELECT
    PAY_DATE,
    IIF(PAY_PAYTYPE=1,PAY_SUM,0) as AVANS,
    IIF(PAY_PAYTYPE<>1,PAY_SUM,0) as SPISANIE,
    IIF(PAY_PAYTYPE=1,PAY_SUM,0)-IIF(PAY_PAYTYPE<>1,PAY_SUM,0) as BALANCE
FROM PAYMENTS
ORDER BY PAY_DATE

Результат (из промежуточной таблички берем стартовый баланс и спускаемся со смещением с помощью оконной функции):

SELECT 
    COALESCE(LAG(START_BALANCE) OVER (ORDER BY PAY_DATE),0) - SPISANIE + AVANS AS BALANCE,
    T.*
FROM (
    SELECT
        PAY_DATE,
        IIF(PAY_PAYTYPE=1,PAY_SUM,0) as AVANS,
        IIF(PAY_PAYTYPE<>1,PAY_SUM,0) as SPISANIE,
        IIF(PAY_PAYTYPE=1,PAY_SUM,0)-IIF(PAY_PAYTYPE<>1,PAY_SUM,0) as START_BALANCE
    FROM PAYMENTS
        ORDER BY PAY_DATE
) T

#