MySql Query для предотвращения отрицательного баланса - PullRequest
0 голосов
/ 18 октября 2019

Можно ли избежать отрицательного баланса с помощью запроса MySql? У меня есть следующая таблица MySql:

trx_no  trx_date    Opening debit   credit 
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

Вы видите, что есть отрицательный баланс(-100) на 2019-10-03. Можно ли сделать запрос 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

1 Ответ

0 голосов
/ 18 октября 2019

Условие:

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