mysql - 如何从现有余额中获取新的运行余额?

标签 mysql sql

这是我的 sql 和查询的输出...

SQL:

SELECT
id ID, 
token TK, 
actual_pay PAY,
IF(@rtp IS NULL, @rtp:=token, @rtp:=@bal+actual_pay) RTP,
IF(@bal IS NULL, @bal:=actual_pay-token, @bal:=@rtp-token) BAL
FROM token_table a
JOIN (SELECT @rtp:=NULL, @bal:=NULL) b;

输出:

+----+------+-----+------+------+
| ID | TK   | PAY | RTP  | BAL  |
+----+------+-----+------+------+
|  1 | 500  | 900 |  500 |  400 |
|  2 | 1200 | 900 | 1300 |  100 |
|  3 | 900  | 900 | 1000 |  100 |
|  4 | 900  | 900 | 1000 |  100 |
|  5 | 400  | 900 | 1000 |  600 |
|  6 | 300  | 900 | 1500 | 1200 |
|  7 | 500  | 900 | 2100 | 1600 |
|  8 | 1700 | 900 | 2500 |  800 |
|  9 | 1800 | 900 | 1700 | -100 |
| 10 | 800  | 900 |  800 |    0 |
| 11 | 900  | 900 |  900 |    0 |
| 12 | 0    | 850 |  850 |  850 |
+----+------+-----+------+------+

这是我想要得到的输出...

问题:
1. stat字段的公式为:如果BAL的值(从ID=1开始)小于等于TK的值(从ID=2开始),如果是则值为1,否则值为0 .

2、nbal字段的公式为:如果BAL的值(从ID=1开始)小于等于TK的值(从ID=2开始),如果是则取值为0,否则取值为BAL (来自 ID=1)减去 TK(来自 ID=2)。

3. ntk字段的公式为:如果BAL的值(from ID=1)小于等于TK的值(from ID=2),如果是则该值应该是TK(from ID=2)减去BAL (来自 ID=1),否则该值应为 BAL(来自 ID=1)减去 TK(来自 ID=2)。

+----+------+-----+------+------+------+------+------+
| ID | TK   | PAY | RTP  | BAL  | stat | nbal | ntk  |
+----+------+-----+------+------+------+------+------+
|  1 | 500  | 900 |  500 |  400 |    1 | 0    | 0    |
|  2 | 1200 | 900 | 1300 |  100 |    1 | 0    | 800  |
|  3 | 900  | 900 | 1000 |  100 |    1 | 0    | 800  |
|  4 | 900  | 900 | 1000 |  100 |    1 | 0    | 800  |
|  5 | 400  | 900 | 1000 |  600 |    0 | 300  | 300  |
|  6 | 300  | 900 | 1500 | 1200 |    0 | 700  | 0    |
|  7 | 500  | 900 | 2100 | 1600 |    1 | 0    | 0    |
|  8 | 1700 | 900 | 2500 |  800 |    1 | 0    | 100  |
|  9 | 1800 | 900 | 1700 | -100 |    1 | 0    | 1000 |
| 10 | 800  | 900 |  800 |    0 |    1 | 0    | 900  |
| 11 | 900  | 900 |  900 |    0 |    1 | 0    | 900  |
| 12 | 0    | 850 |  850 |  850 |    0 | 850  | 0    |
+----+------+-----+------+------+------+------+------+

最佳答案

Case 语句 可以处理您的情况。

SELECT id ID, token TK, actual_pay PAY,
       IF(@rtp IS NULL, @rtp:=token, @rtp:=@bal+actual_pay) RTP,
       IF(@bal IS NULL, @bal:=actual_pay-token, @bal:=@rtp-token) BAL,

       (case IF(@rtp IS NULL, @rtp:=token, @rtp:=@bal+actual_pay)
         when IF(@rtp IS NULL, @rtp:=token, @rtp:=@bal+actual_pay) <= 
              (select token from token_table where id = a.id+1)
         then 1
        else 0
       end case) stat,

      (case IF(@bal IS NULL, @bal:=actual_pay-token, @bal:=@rtp-token)
        when IF(@bal IS NULL, @bal:=actual_pay-token, @bal:=@rtp-token) <= 
             (select token from token_table where id = a.id+1)
        then 0
       else 
        IF(@bal IS NULL, @bal:=actual_pay-token, @bal:=@rtp-token) - 
        (select token from token_table where id = a.id+1)
      end case) nbal,

      (case IF(@bal IS NULL, @bal:=actual_pay-token, @bal:=@rtp-token)
        when IF(@bal IS NULL, @bal:=actual_pay-token, @bal:=@rtp-token) <= 
             (select token from token_table where id = a.id+1)           
        then
            (select token from token_table where id = a.id+1)  -
            IF(@bal IS NULL, @bal:=actual_pay-token, @bal:=@rtp-token)
       else 
        IF(@bal IS NULL, @bal:=actual_pay-token, @bal:=@rtp-token) - 
        (select token from token_table where id = a.id+1)
      end case) ntk

FROM token_table a
JOIN (SELECT @rtp:=NULL, @bal:=NULL) b;

关于mysql - 如何从现有余额中获取新的运行余额?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24523109/

相关文章:

php - 使用自定义日期字符串在 PHP 中从 MySQL 获取最近 24 小时的数据

mysql - 错误 1045 从 DMS 源数据库访问被拒绝

php - 在 Laravel 查询生成器或 SQL 中将两个查询合并为一个

mysql - 在环回中使用远程方法增加模型中的字段?

mysql - 在 ‘BEFORE UPDATE’ mysql 触发器中将值设置为 NULL

mysql - SQL - ORDER BY ASC LIMIT 1 排除多个相同的结果 - 最好的方法?

mysql - 语法错误: missing `closing parenthesis` MySQL

sql - 查找每个客户的第二个约会日期

mysql - SQL:帮助我选择 1 -> N -> N 关系中的记录

mysql - 将某些值排序到顶部