Как получить баланс из таблицы транзакций - PullRequest
1 голос
/ 11 марта 2020

У меня есть таблица транзакций на моем postgresql сервере с такой схемой

CREATE TABLE tbl_transaction
(
  id serial NOT NULL,
  id_coa integer,
  date_trx date,
  amount numeric(15,2),
  dc character varying(1)
);

И такими данными

INSERT INTO tbl_transaction (id, id_coa, amount, date_trx, dc)
VALUES
   (1, 1, 100, '2020-01-31', 'D'),
   (2, 2, 100, '2020-01-31', 'D'),
   (3, 3, 100, '2020-01-31', 'D'),
   (4, 1, 100, '2020-02-01', 'D'),
   (5, 1, 50, '2020-02-01', 'C'),
   (6, 1, 200, '2020-02-02', 'D'),
   (7, 2, 150, '2020-02-01', 'D'),
   (8, 2, 70, '2020-02-01', 'C'),
   (9, 2, 120, '2020-02-02', 'D'),
   (10, 3, 200, '2020-02-01', 'D'),
   (11, 3, 120, '2020-02-01', 'C'),
   (12, 3, 130, '2020-02-02', 'D');

Из приведенных выше данных, если я сделаю запрос с 2020- 02-01 до 2020-02-02, я хочу получить результат, подобный приведенному ниже:

| id  | id_coa | date_trx   |beginning_balance| debit  | credit |
| --- | ------ | ---------- |-----------------| ------ | ------ |
| 4   | 1      | 2020-02-01 | 100.00          | 100.00 | 0      |
| 5   | 1      | 2020-02-01 | 200.00          | 0      | 50.00  |
| 6   | 1      | 2020-02-02 | 150.00          | 200.00 | 0      |
| 7   | 2      | 2020-02-01 | 100.00          | 150.00 | 0      |
| 8   | 2      | 2020-02-01 | 250.00          | 0      | 70.00  |
| 9   | 2      | 2020-02-02 | 180.00          | 120.00 | 0      |
| 10  | 3      | 2020-02-01 | 100.00          | 200.00 | 0      |
| 11  | 3      | 2020-02-01 | 300.00          | 0      | 120.00 |
| 12  | 3      | 2020-02-02 | 180.00          | 130.00 | 0      |

Мой запрос, как показано ниже:

SELECT 
    jc.id,
    jc.id_coa,
    jc.date_trx,
    CASE
      WHEN jc.dc = 'D' THEN
      jc.amount
      ELSE 0
    END AS debit,
    CASE
      WHEN dc = 'C' THEN
      jc.amount
      ELSE 0
    END AS credit
  FROM tbl_transaction jc
  WHERE jc.date_trx >= '2020-02-01'
    AND jc.date_trx <= '2020-02-02'
  ORDER BY jc.id_coa ASC

Мой вопрос:

Как получить начальный баланс?

  • beginning_balance = SUM(debit-credit) before '2020-02-01' + debit on date_trx ИЛИ
  • beginning_balance = SUM(debit-credit) before '2020-02-01' - credit on date trx

1 Ответ

1 голос
/ 11 марта 2020

Используйте подзапрос для расчета баланса с помощью оконных функций. Затем выполните фильтрацию во внешнем запросе:

select *
from (select id, id_coa, date_trx,
         (sum(case when dc = 'C' then -amount else amount end) over (partition by id_coa order by id) -
          (case when dc = 'C' then -amount else amount end)
         ) as balance,
             (case when dc = 'C' then amount else 0 end) as credit,
             (case when dc = 'D' then amount else 0 end) as debit
      from tbl_transaction t
     ) t
where t.date_trx >= '2020-02-01' and t.date_trx <= '2020-02-02';

Здесь - это db <> скрипка.

Кстати, странно, что кредиты вычитаются и дебеты добавляются.

...