Может кто-нибудь сказать мне запрос для переноса баланса на следующий день в оракуле? - PullRequest
0 голосов
/ 28 сентября 2018

Здесь у нас есть данные о кредитных и дебетовых платежах за две даты.Пожалуйста, сообщите мне запрос для переноса сальдо от одной даты транзакции к другой.

пример таблицы:

TRANS_DATE    CREDIT      DEBIT
--------- ---------- ----------
24-SEP-18       2500        400
24-SEP-18                   200
24-SEP-18        500
30-SEP-18        400       1200
30-SEP-18        400

Ожидаемый выходной результат:

 TRANS_DATE    BALANCE
---------  ----------
24-SEP-18       2400
30-SEP-18       2000

Ответы [ 2 ]

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

Вы ищете аналитическую функцию SUM .

Первый агрегат CREDIT и DEBIT на уровне дня (с использованием GROUP BY), см. Подзапрос ниже.

Чем использовать аналитическую функцию SUM

sum(CREDIT - DEBIT) over (order by TRANS_DATE) as balance

Вы опустили опцию windowing_clause, что означает, что вы суммируете всю строку до текущей строки в данном порядке.См. Соответствующую часть из документации ниже.

Если вы полностью опустите windowing_clause, по умолчанию будет использоваться ДИАПАЗОН МЕЖДУ НЕПРЕРЫВНЫМ ПРЕЦЕДИРОВАНИЕМ И ТЕКУЩЕЙ СТРОКОЙ.

Обратите внимание, что вы рассчитываете баланс в глобальном масштабе, поэтому вы не делаетеиспользуйте предложение PARTITION BY.Вы сделаете это, если рассмотрите баланс, например, на основе учетной записи.

Запрос

with day_bal as (
select trans_date, sum(nvl(credit,0)) credit, sum(nvl(debit,0)) debit from bal
group by trans_date)
select 
TRANS_DATE, CREDIT, DEBIT,
sum(CREDIT - DEBIT) over (order by TRANS_DATE) as balance
from day_bal
order by 1;

дает

TRANS_DATE              CREDIT      DEBIT    BALANCE
------------------- ---------- ---------- ----------
24-09-2018 00:00:00       3000        600       2400
30-09-2018 00:00:00        800       1200       2000
0 голосов
/ 28 сентября 2018

Вы можете суммировать кредиты и дебеты и вычитать последние из первых:

SELECT   trans_date, SUM(credit) - SUM(debit) AS balance
FROM     mytable
GROUP BY trans_date
...