谁能告诉我在 oracle 中将余额结转到第二天的查询?
Can anyone tell me query to carry forward balance to next day in oracle?
这里我们有两个日期的贷方和借方数据。请告诉我将余额从一个交易日期结转到另一个交易日期的查询。
样本table:
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
您可以将贷方和借方相加,然后从前者中减去后者:
SELECT trans_date, SUM(credit) - SUM(debit) AS balance
FROM mytable
GROUP BY trans_date
您正在寻找 analytical SUM
function。
首先在一天级别聚合 CREDIT
和 DEBIT
(使用 GROUP BY),请参阅下面的子查询。
比使用解析SUM
函数
sum(CREDIT - DEBIT) over (order by TRANS_DATE) as balance
您省略了 windowing_clause,这意味着您按照给定的顺序将所有行加到当前行。请参阅以下文档中的相关部分。
If you omit the windowing_clause entirely, then the default is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
请注意,您计算的是全局余额,因此您不使用 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
这里我们有两个日期的贷方和借方数据。请告诉我将余额从一个交易日期结转到另一个交易日期的查询。
样本table:
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
您可以将贷方和借方相加,然后从前者中减去后者:
SELECT trans_date, SUM(credit) - SUM(debit) AS balance
FROM mytable
GROUP BY trans_date
您正在寻找 analytical SUM
function。
首先在一天级别聚合 CREDIT
和 DEBIT
(使用 GROUP BY),请参阅下面的子查询。
比使用解析SUM
函数
sum(CREDIT - DEBIT) over (order by TRANS_DATE) as balance
您省略了 windowing_clause,这意味着您按照给定的顺序将所有行加到当前行。请参阅以下文档中的相关部分。
If you omit the windowing_clause entirely, then the default is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
请注意,您计算的是全局余额,因此您不使用 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