mysql借贷累计余额

66bbxpm5  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(322)

我想要下表的累计dr或cr余额:

+-----------+--------------+---------------+---------+
|        id |       Date   |       DR      |    CR   |
+-----------+--------------+---------------+---------+
|         1 |   2020-01-01 |           100 |       0 |
|         2 |   2020-01-01 |           200 |       0 |
|         3 |   2020-01-02 |             0 |     200 |
|         4 |   2020-01-02 |             0 |      50 |
|         5 |   2020-01-03 |            20 |       0 |
+-----------+--------------+---------------+---------+

对于上表,累积 Balance 列将是:

+-----------+--------------+---------------+---------+----------+
|        id |       Date   |       DR      |    CR   |  Balance |
+-----------+--------------+---------------+---------+----------+
|         1 |   2020-01-01 |           100 |       0 |   100 DR |
|         2 |   2020-01-01 |           200 |       0 |   300 DR |
|         3 |   2020-01-02 |             0 |     300 |     0 DR |
|         4 |   2020-01-02 |             0 |      50 |    50 CR |
|         5 |   2020-01-03 |            20 |      0  |    30 CR |
+-----------+--------------+---------------+---------+----------+

将dr降低到0以下将使其成为cr
将cr降低到0以下将使其成为dr
如果余额为0,则值为 0 DR 它可以被计算为cr是一个负值,但是我想在一个 abs 数值。
mysql版本14.14发行版5.7.23,用于linux(x86\u 64),使用editline Package 器
谢谢你的帮助

q0qdq0h2

q0qdq0h21#

如果您运行的是mysql 8.0,则可以使用窗口函数:

select
    t.*,
    concat(
        abs(sum(dr - cr) over(order by date, id)),
        ' ',
        case when sum(dr - cr) over(order by date, id) >= 0 then 'DR' else 'CR' end
    ) balance
from mytable t

在早期版本中,一个有效的选项使用会话变量:

set @sm = 0;    
select id, date, dr, cr, concat(abs(bal), ' ', case when bal >= 0 then 'DR' else 'CR' end) balance
from (
    select 
        t.*,
        @sm := @sm + dr - cr bal
    from (select t.* from mytable t order by date, id) t
) t

db fiddle上的演示-两个查询都产生:

| id  | date       | dr  | cr  | balance |
| --- | ---------- | --- | --- | ------- |
| 1   | 2020-01-01 | 100 | 0   | 100 DR  |
| 2   | 2020-01-01 | 200 | 0   | 300 DR  |
| 3   | 2020-01-02 | 0   | 300 | 0 DR    |
| 4   | 2020-01-02 | 0   | 50  | 50 CR   |
| 5   | 2020-01-03 | 20  | 0   | 30 CR   |

相关问题