【问题标题】:MySQL Debit/Credit cumulative balanceMySQL借/贷累积余额
【发布时间】:2020-10-05 02:49:43
【问题描述】:

我想要下表的累积 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 数值之后的余额栏中显示“DR”和“CR”文本。

mysql Ver 14.14 Distrib 5.7.23,适用于使用 EditLine 包装器的 Linux (x86_64)

感谢您的帮助

【问题讨论】:

    标签: mysql sql select sum window-functions


    【解决方案1】:

    如果你运行的是 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多