mysql - MySql 查询避免负余额
问题描述
是否可以使用 MySql 查询来避免负余额?我有以下 MySql 表:
trx_no trx_date 期初借方贷方 1 2019-10-01 200 0 100 2 2019-10-02 200 0 100 3 2019-10-03 200 100 0 4 2019-10-03 200 400 0 5 2019-10-03 200 0 200 6 2019-10-04 200 0 100 7 2019-10-05 200 0 400
使用此查询:
SELECT
trx_no,
trx_date,
Opening,
debit,
credit,
Opening + (SELECT SUM(t2.credit - t2.debit)
FROM MyTable t2
WHERE t2.trx_no <= t1.trx_no) AS balance
FROM MyTable t1
ORDER BY
trx_no;
我有:
trx_no trx_date Opening debit credit balance
1 2019-10-01 200 0 100 300
2 2019-10-02 200 0 100 400
3 2019-10-03 200 100 0 300
4 2019-10-03 200 400 0 -100
5 2019-10-03 200 0 200 100
6 2019-10-04 200 0 100 200
7 2019-10-05 200 0 400 600
您可以看到 2019-10-03 存在负余额 (-100)。如果在同一日期有借方和贷方,是否可以通过首先允许贷方计算 来进行 mysql 查询以避免负余额?所以结果会变成:
trx_no trx_date Opening debit credit balance
1 2019-10-01 200 0 100 300
2 2019-10-02 200 0 100 400
5 2019-10-03 200 0 200 600
3 2019-10-03 200 100 0 500
4 2019-10-03 200 400 0 100
6 2019-10-04 200 0 100 200
7 2019-10-05 200 0 400 600
解决方案
条件:
WHERE t2.trx_no <= t1.trx_no
在您的情况下不起作用。
您需要按 排序的行trx_date
,然后首先按贷方排序,然后按借方排序,最后按trx_no
。
此代码将使用这 3 个条件的组合列(带有连接):
SELECT
t1.trx_no,
t1.trx_date,
t1.Opening,
t1.debit,
t1.credit,
t1.Opening + (
SELECT SUM(t2.credit - t2.debit)
FROM MyTable t2
WHERE
concat(t2.trx_date, t2.debit > t2.credit, lpad(t2.trx_no, 10, '0')) <=
concat(t1.trx_date, t1.debit > t1.credit, lpad(t1.trx_no, 10, '0'))
) AS balance
FROM MyTable t1
ORDER BY concat(t1.trx_date, t1.debit > t1.credit, lpad(t1.trx_no, 10, '0'))
请参阅演示。
结果:
| trx_no | trx_date | Opening | debit | credit | balance |
| ------ | ---------- | ------- | ----- | ------ | ------- |
| 1 | 2019-10-01 | 200 | 0 | 100 | 300 |
| 2 | 2019-10-02 | 200 | 0 | 100 | 400 |
| 5 | 2019-10-03 | 200 | 0 | 200 | 600 |
| 3 | 2019-10-03 | 200 | 100 | 0 | 500 |
| 4 | 2019-10-03 | 200 | 400 | 0 | 100 |
| 6 | 2019-10-04 | 200 | 0 | 100 | 200 |
| 7 | 2019-10-05 | 200 | 0 | 400 | 600 |
推荐阅读
- linux - 在 Fedora (Linux) 中自动将屏幕截图复制到剪贴板
- amazon-web-services - 我可以将 cloudfront 与 route53 流量策略一起使用吗?
- c++ - 保存或放弃用户对对象的更改
- php - 如何从当前订单中获取 WooCommerce 订单 ID?
- php - 来自 db 的重音字符在服务器迁移后未立即显示
- python - 为什么附加到字典中的列表会产生不同的结果?
- vue.js - npm install package throws error The operation was denied by your operating system
- reactjs - 如何使用 Material UI Cards 将按钮连接到表单提交?
- c++ - Qt 和 Arduino 串行通信(读写)
- fortran - 编译后的英特尔编译器 XE 19 在 Windows 10 AMD Ryzen 上无法使用 /Qparallel 出现错误 0xc000007b