Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL借方/贷方累计余额_Mysql_Sql_Select_Sum_Window Functions - Fatal编程技术网

MySQL借方/贷方累计余额

MySQL借方/贷方累计余额,mysql,sql,select,sum,window-functions,Mysql,Sql,Select,Sum,Window Functions,我想要下表的累积DR或CR余额: +-----------+--------------+---------------+---------+ | id | Date | DR | CR | +-----------+--------------+---------------+---------+ | 1 | 2020-01-01 | 100 | 0 | | 2 |

我想要下表的累积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 |
+-----------+--------------+---------------+---------+

对于上表,累计
余额
列为:


+-----------+--------------+---------------+---------+----------+
|        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为负值,但我希望“DR”和“CR”文本显示在
abs
数值后的余额列中

mysql版本14.14发行版5.7.23,适用于Linux(x86_64),使用编辑行包装


感谢您的帮助

如果您正在运行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
-两个查询都会产生:

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