MySQL借方/贷方累计余额
我想要下表的累积DR或CR余额: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 |
+-----------+--------------+---------------+---------+
| 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 |