【发布时间】:2017-07-12 19:21:07
【问题描述】:
我有 2 个表 AmountIn 和 AmountOut。
第一个表 Amountin 是这样的:
金额
+--------+--------------+-----------+
| account| date | AmountIn |
+--------+--------------+-----------+
| A | 2017/2/6 | 200 |
| A | 2017/2/5 | 100 |
| A | 2017/2/5 | 500 |
| B | 2017/2/1 | 1000 |
| B | 2017/2/1 | 2000 |
| C | 2017/1/20 | 25 |
+--------+----+---------+-----------+
第二个看起来像:
金额
+--------+--------------+-----------+
| account| date |AmountOut |
+--------+--------------+-----------+
| A | 2017/2/8 | 200 |
| A | 2017/2/7 | 100 |
| A | 2017/2/6 | 500 |
| B | 2017/2/2 | 1000 |
| B | 2017/2/1 | 2000 |
| C | 2017/1/20 | 25 |
+--------+----+---------+-----------+
现在我想要一个显示如下结果的查询: 对于帐户A
+--------+--------------+----------+-----------+------------+
| account| date | AmountIn | AmountOut | Balancy |
+--------+--------------+-------- -+-----------+------------+
| A | 2017/2/8 | 0 | 200 | 0 |
| A | 2017/2/7 | 0 | 100 | 200 |
| A | 2017/2/6 | 200 | 0 | 300 |
| A | 2017/2/6 | 0 | 500 | 100 |
| A | 2017/2/5 | 100 | 0 | 600 |
| A | 2017/2/5 | 500 | 0 | 500 |
+--------+----+---------+----------+-----------+------------+
这意味着合并两个表并将balancy 计算为:
last balance + AmountIn - AmounOut
我的代码是:
select
t.*,
@sum := if(@account = account,
@sum + AmountIn - AmountOut,
if((@account := account) is not null,
AmountIn - AmountOut, 0)
) balance
from (
select
*
from (
select
1 x,
account,
date,
AmountIn,
0 AmountOut
from AmountIn
union all
select
0 x,
account,
date,
0 AmountIn,
AmountOut
from AmountOut
) t order by account, date, x
) t cross join (select @account := null, @sum := 0) t2
但它给了我日期升序的结果,我希望它按日期降序排序。我需要看到最后的操作,否则当数据丢失时,我将很难向下滚动或转到下一页 请帮忙
【问题讨论】:
-
t order by account, date desc, x -
在这种情况下,“平衡”会变得一团糟,不正确
-
添加了基于非标准语法的
mysql标签
标签: mysql sql join subquery union