这是我的 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/