Как рассчитать остаток по кредитно-дебетовым? - PullRequest
1 голос
/ 20 января 2020

Как получить сумму баланса на основе кредита CRD и дебета DEB для каждого клиента cust из следующей таблицы txn_tbl

SQL> SELECT * FROM txn_tbl;

CUS        AMT TXN_CDE
--- ---------- ----------
A          500 CRD
B          400 CRD
A          350 CRD
C          235 DEB
C          800 CRD
B          132 DEB
D          673 CRD

Это запрос, который я пробовал

SELECT cust, LAG(amt,1,0) OVER (PARTITION BY cust ORDER BY cust) "Bal"
 FROM 
(SELECT cust, SUM(amt)amt
 FROM txn_tbl
 GROUP BY cust, txn_cde
 ORDER BY 2);

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Если вы хотите, чтобы баланс выполняется , вы можете сделать сумму окна с условными логами c:

select 
    t.*,
    sum(case when txn_cde = 'CRD' then amt else -amt end) 
        over(partition by cus order by id) running_balance
from mytable

Чтобы это работало, вам нужен столбец, который можно используется для заказа записей; Я предположил, id.

С другой стороны, если вы хотите, чтобы общий баланс на одного клиента (так, только одна запись на клиента в наборе результатов), вы можете использовать тот же лог c с агрегацией (и вам не нужен заказывающий столб):

select cus, sum(case when txn_cde = 'CRD' then amt else -amt end) balance
from mytable
group by cus
1 голос
/ 20 января 2020

Вы можете просто суммировать свои суммы. Хитрость заключается в том, чтобы сделать ваш кредит (или дебет, это не ясно) отрицательным:

SELECT cust, Sum(CASE WHEN TXN_CODE = 'DEB' THEN -1 ELSE 1 END * amt) as
FROM txn_tbl 
GROUP BY cust
...