Mysql - 金额之间的平衡

时间:2014-09-12 02:21:39

标签: mysql sql database subquery

我正试图在每一行的金额之间取得平衡。基本上需要加上或减去前一个记录字段的值。

表:

+------+------------+---------+---------+
| id   | expiration |  amount | is_paid |
+------+------------+---------+---------+
| 4    | 2014-09-02 |  100.00 |    1    |
| 10   | 2014-09-03 |  200.00 |    1    |
| 35   | 2014-09-03 |  10.32  |    0    |
| 2    | 2014-09-03 |  -32.00 |    1    |
| 1    | 2014-09-04 |  -50.00 |    0    |
| 200  | 2014-09-04 |  400.00 |    1    |
| 30   | 2014-09-05 |  100.00 |    1    |
+------+------------+---------+---------+

我想创建一个VIEW,以便在设置为is_paid = 1且在到期日期之间的字段中计算余额。 例如:

+------+------------+---------+---------+---------+
| id   | expiration |  amount | is_paid | balance |
+------+------------+---------+---------+---------+
| 4    | 2014-09-02 |  100.00 |    1    |  100.00 |
| 10   | 2014-09-03 |  200.00 |    1    |  300.00 |
| 35   | 2014-09-03 |  10.32  |    0    |  300.00 |
| 2    | 2014-09-03 |  -30.00 |    1    |  270.00 |
| 1    | 2014-09-04 |  -50.00 |    0    |  270.00 |
| 200  | 2014-09-04 |  400.00 |    1    |  670.00 |
| 30   | 2014-09-05 |  100.00 |    1    |  770.00 |
+------+------------+---------+---------+---------+

帮助我!!

1 个答案:

答案 0 :(得分:3)

为什么需要将它放入视图中?这是将为您计算的选择

SELECT * , 
       @a := if(is_paid = 1,  @a + amount, @a) as balance
FROM table
CROSS JOIN(SELECT @a := 0)t

DEMO

这是一个如何运作的细分......

从表中提取您想要的内容,还包括一个名为balance的新列。
这里的余额是前一行的余额加上当前的金额,如果它被标记为付费is_paid ...但是如果它没有支付那么它只是重复余额。

if (condition, true / then, false / else)

所以如果是is_paid,那么用当前的余额添加前一个余额(@a包含前一行余额,直到你用下一行的if语句重置它)如果没有付款那么只需重复@a余额

希望有用