MySQL未结余额贷方余额余额
问题描述:
我收到了一张名为“Stock”的表,如下所示。MySQL未结余额贷方余额余额
+-----------+--------------+---------------+---------+
| client_id | date | credit | debit|
+-----------+--------------+---------------+---------+
| 1 | 01-01-2015 | 50 | 0 |
| 2 | 01-01-2015 | 250 | 0 |
| 2 | 01-01-2015 | 500 | 0 |
| 2 | 02-01-2015 | 0 | 500 |
| 1 | 02-01-2015 | 0 | 40 |
| 1 | 02-01-2015 | 0 | 80 |
| 3 | 05-01-2015 | 3000 | 0 |
| 2 | 06-01-2015 | 0 | 350 |
| 4 | 06-01-2015 | 0 | 1000 |
| 4 | 06-01-2015 | 0 | 2000 |
| 4 | 07-01-2015 | 500 | 0 |
| 5 | 07-01-2015 | 500 | 0 |
| 5 | 08-01-2015 | 500 | 0 |
| 1 | 09-01-2015 | 0 | 100 |
+-----------+--------------+---------------+---------+
我期待的结果是这样的:
+---------+-----------+-------------+--------+---------+----------+
|client_id| date |Open_Balance | credit | debit | balance |
+---------+-----------+-------------+--------+---------+----------+
| 1 |01-01-2015 | 0 | 50 | 0 | 50 |
| 1 |02-01-2015 | 50 | 0 | 40 | 10 |
| 1 |02-01-2015 | 10 | 0 | 80 | -70 |
| 1 |09-01-2015 | -70 | 0 | 100 | -170 |
| 2 |01-01-2015 | 0 | 250 | 0 | 250 |
| 2 |01-01-2015 | 250 | 500 | 0 | 750 |
| 2 |02-01-2015 | 750 | 0 | 500 | 250 |
| 2 |06-01-2015 | 250 | 0 | 350 | -100 |
| 3 |05-01-2015 | 0 | 3000 | 0 | 3000 |
| 4 |06-01-2015 | 0 | 0 | 1000 | -1000 |
| 4 |06-01-2015 | -1000 | 0 | 2000 | -3000 |
| 4 |07-01-2015 | -3000 | 500 | 0 | -2500 |
| 5 |07-01-2015 | 0 | 500 | 0 | 500 |
| 5 |08-01-2015 | 500 | 500 | 0 | 1000 |
+---------+-----------+-------------+--------+---------+---- -----+
我需要平衡和“打开余额”,由CLIENT_ID和日期顺序来计算,如上图所示。请帮忙。
答
在这里你可以怎么做呢..
select
s.client_id,
s.date,
s.op_balance as Open_Balance,
s.credit,
s.debit,
s.balance
from
(
select
t.client_id,
t.date,
t.credit,
t.debit,
@tot_credit := if(@prev_client = t.client_id, @tot_credit + t.credit,t.credit) as tot_cred,
@tot_debit := if(@prev_client = t.client_id,@tot_debit + t.debit,t.debit) as tot_deb,
@cur_bal := if(@prev_client = t.client_id, @tot_credit - @tot_debit,t.credit-t.debit) as balance,
(@cur_bal + t.debit) - t.credit as op_balance,
@prev_client := t.client_id
from(
select * from stock order by client_id,date
)t,(select @prev_client:=0,@cur_bal:=0,@tot_credit:=0,@tot_debit:= 0,@open_balance:=0)r
)s
而且我注意到,同样的数据,你有我都用做每个客户ID排序日期列,但它有datetime日期以便排序不会与相同日期混淆或可能是表中的主键。
+0
谢谢Abhik Chakraborty,它完美的作品。 – 2015-03-05 11:07:30
答
首先为开放平衡和平衡设置两个变量;
mysql> set @balance = 0;
mysql> set @openBalance = 0;
然后设置id变量
mysql> set @id := (select client_id from Stock order by client_id asc limit 1);
现在运行此查询
select client_id,date,IF([email protected],@balance:[email protected],@balance:=0),
@openBalance:[email protected] as OpenBalance,credit,debit,@balance:=([email protected])-debit as
bal,@id:=client_id from Stock order by client_id,date;
是啊,因为有些数据具有相同的日期和编号,查询可能工作方式不同所以请做一些修改在你的表格定义中,比如日期而不是日期,你可以设定日期时间,然后进行相应的排序。
先试试 – 2015-03-03 09:26:41
你是怎么计算'Open balances''? – Saif 2015-03-03 09:37:36
每个client_id的初始'未结余额'为零。 – 2015-03-03 09:44:36