Oracle APEX与SQL开发:会计余额报表SQL查询请求
解决Oracle APEX会计报表的账户余额查询问题
作为Oracle APEX和SQL新手,你要的这个账户余额报表其实可以通过拆分借贷方记录再分组汇总的思路来实现,我给你写好查询语句,再一步步解释清楚:
最终SQL查询语句
SELECT account_code AS "Account CODE", NVL(SUM(debit_amount), 0) AS "DEBIT TOTAL", NVL(SUM(credit_amount), 0) AS "CREDIT TOTAL", (NVL(SUM(debit_amount), 0) - NVL(SUM(credit_amount), 0)) AS "BALANCE" FROM ( -- 拆分借方记录:把DBIT CODE作为账户,AMOUNT计入借方 SELECT dbit_code AS account_code, amount AS debit_amount, 0 AS credit_amount FROM ga_voucher UNION ALL -- 拆分贷方记录:把CREDIT CODE作为账户,AMOUNT计入贷方 SELECT credit_code AS account_code, 0 AS debit_amount, amount AS credit_amount FROM ga_voucher ) combined_transactions GROUP BY account_code ORDER BY account_code;
代码逻辑解释
子查询
combined_transactions:- 第一部分把每条凭证里的借方账户和金额拆出来,贷方金额设为0;
- 第二部分把每条凭证里的贷方账户和金额拆出来,借方金额设为0;
- 用
UNION ALL合并这两部分(比UNION效率更高,因为不会去重,我们需要保留所有交易记录)。
外层汇总查询:
GROUP BY account_code:按账户代码分组,计算每个账户的总借方和总贷方;NVL(..., 0):处理某个账户只有借方或只有贷方的情况,避免出现NULL值(比如如果一个账户只有贷方交易,借方总额会显示0而不是空);- 余额计算直接用借方总额 - 贷方总额,完全符合会计余额计算逻辑。
测试你的示例数据
用你提供的两条测试数据运行这个查询,会得到以下结果:
| Account CODE | DEBIT TOTAL | CREDIT TOTAL | BALANCE |
|---|---|---|---|
| 121005 | 40000 | 50000 | -10000 |
| 331001 | 0 | 40000 | -40000 |
| 331002 | 50000 | 0 | 50000 |
如果你的目标示例里331002的余额是10000,可能是测试数据或示例笔误,但这个查询的逻辑是完全合规的会计余额计算方式哦。
内容的提问来源于stack exchange,提问作者Kamruzzaman




