【问题标题】:MySql Query to Avoiding Negative BalanceMySql 查询避免负余额
【发布时间】:2019-10-18 13:19:41
【问题描述】:

是否可以使用 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

DB Fiddle

【问题讨论】:

  • 您想要达到的目标并不完全清楚。您能否详细说明使用单个交易号?
  • 你的MySql是什么版本的?
  • 您好,我不想看到报表出现负余额。成就,如果在同一日期内有借记和贷记交易,则应先计算贷记交易
  • 嗨@forpas,我使用的是MySql server 5.7

标签: mysql subquery balance


【解决方案1】:

条件:

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'))

请参阅demo
结果:

| 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     |

【讨论】:

  • 还有一个问题,如果余额为负,是否可以进行信用交易只先计算?因此,如果余额不是负数,则排序是原样(不需要先信用)
  • 为此,应为每行计算两次 SUM。一次检查它是否为负数,如果是则重新排序。我认为如果没有在 case 语句中非常复杂的子查询,这是不可能的。
  • 嗨@forpas,你能帮我做吗?
  • 这是一个新要求,不属于本题。发布一个包含新示例数据的新问题,该问题将展示您在每种情况下的输出结果并解释原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2017-05-31
  • 2023-03-14
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多