SQLite: текущий баланс с конечным балансом - PullRequest
0 голосов
/ 27 сентября 2019

У меня конечный баланс 5000 долларов.Мне нужно создать текущий баланс, но настройте первый ряд, чтобы показать конечный баланс, а затем сложите остаток, чтобы он выглядел как выписка из банка.Вот то, что у меня есть для текущего баланса, но как я могу настроить строку 1, чтобы не отображать сумму первого ряда, а вместо этого конечный баланс.

with BalBefore as (
  select *
  from transactions
  where ACCT_NAME = 'Real Solutions'
  ORDER BY DATE DESC
)

select
  DATE,
  amount,
  '$' || printf("%.2f", sum(AMOUNT) over (order by ROW_ID)) as Balance
from BalBefore;

Это дает мне "

DATE         AMOUNT     BALANCE
9/6/2019     -31.00     $-31.00      <- I need this balance to be replaced with $5000 and have the rest
9/4/2019      15.00     $-16.00         sum as normal.
9/4/2019      15.00     $-1.00
9/3/2019     -16.00     $-17.00

Я прочитал много других вопросов, но не смог найти тот, который мог бы понять, поэтому решил написать более простой вопрос.

1 Ответ

0 голосов
/ 28 сентября 2019

Следующее не является коротким и приятным, но используя оператор WITH и CTE , я надеюсь, что логика очевидна.Определены несколько CTE, которые ссылаются друг на друга, чтобы сделать общий запрос более читабельным.В целом цель состояла в том, чтобы просто добавить запись начального сальдо, которая могла бы быть:

/*
DROP TABLE IF EXISTS data;
CREATE temp TABLE data (
       id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
       date DATETIME  NOT NULL,
       amount NUMERIC NOT NULL
);   

INSERT INTO data
(date, amount)
VALUES
     ('2019-09-03', -16.00),
     ('2019-09-04',  15.00),
     ('2019-09-04',  15.00),
     ('2019-09-06', -31.00)
;
*/

WITH 
     initial_filter AS (
         SELECT id, date, amount
         FROM data
         --WHERE ACCT_NAME = 'Real Solutions'
     ),
     prepared AS (
         SELECT *
         FROM initial_filter
         UNION ALL
         SELECT 
            9223372036854775807 as id, --largest signed integer 
            (SELECT MAX(date) FROM initial_filter) AS FinalDate, 
            -(5000.00) --ending balance (negated for summing algorithm)
     ),
     running AS (
          SELECT
                id,
                date,
                amount,
                SUM(-amount) OVER 
                    (ORDER BY date DESC, id DESC 
                     RANGE UNBOUNDED PRECEDING 
                     EXCLUDE CURRENT ROW) AS balance
          FROM prepared
          ORDER BY date DESC, id DESC
     )
SELECT *
FROM running
WHERE id != 9223372036854775807
ORDER BY date DESC, id DESC;

. Это приводит к следующему

id  date         amount balance
4   2019-09-06  -31.00  5000
3   2019-09-04   15.00  5031
2   2019-09-04   15.00  5016
1   2019-09-03  -16.00  5001

ОБНОВЛЕНИЕ: первый запрос не выдает правильные сальдо.Строка начального сальдо и оконная функция (т. Е. Предложение OVER) были обновлены для точного суммирования по правильным суммам.
Примечание : сальдо по каждой строке определяется полностью из предыдущих строк, а не изсумма текущей строки, поскольку она работает в обратном направлении от конечного сальдо , а не от предыдущего сальдо строки.

...