#mysql #sql #balance
#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(из ID= 1) меньше или равно значению TK(из ID= 2), если да, то значение должно быть TK (из 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 |
---- ------ ----- ------ ------ ------ ------ ------
Ответ №1:
Case statement
может справиться с вашим состоянием.
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;
Ответ №2:
Добавление left join
в следующую строку:
select a.id, a.tk, a.pay, a.rtp, a.bal, a.stat, a.nbal, a.ntk
from (
select a.id, a.token tk, a.actual_pay pay,
if(@rtp is null, @rtp:=a.token, @rtp:=@bal a.actual_pay) rtp,
ifnull(abs(@bal-a.token),0) ntk,
if(@bal is null, @bal:=a.actual_pay-a.token, @bal:=@rtp-a.token) bal,
@bal <= ifnull(c.token,0) stat,
greatest(0, @bal-ifnull(c.token,0)) nbal
from records a
join (select @rtp:=null, @bal:=null) b
left join records c on a.id = c.id-1) a;
Комментарии:
1. Спасибо за ваш отличный ответ. Во-первых, значение ntk (из ID = 1) должно быть 0, а значение ntk (из ID = 12) также должно быть 0.
2. @xenonleaux, я понимаю, если вы хотите установить последнее значение равным нулю, поскольку нет строки 13, но не должна ли быть строка 1
1200 - 400
?3. dl.dropboxusercontent.com/u/51673150/problem.png вот пример изображения, которое я пытаюсь исправить в Excel….