Как получить новый текущий баланс из существующего баланса?

Вот мой 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. Формула поля статистики: Если значение 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=2) =1) минус ТК(из 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    |
+----+------+-----+------+------+------+------+------+

person xdiver    schedule 02.07.2014    source источник


Ответы (2)


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;
person Charlesliam    schedule 02.07.2014

Добавляем 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:[email protected]) 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;

скрипка

person Fabricator    schedule 02.07.2014
comment
Спасибо за отличный ответ. Во-первых, значение ntk(от ID=1) должно быть 0, и значение ntk(от ID=12) также должно быть 0. - person xdiver; 02.07.2014
comment
@xenonleaux, я понимаю, если вы хотите установить последнее значение равным нулю, поскольку строки 13 нет, но разве строка 1 не должна быть 1200 - 400? - person Fabricator; 02.07.2014
comment
dl.dropboxusercontent.com/u/51673150/problem.png вот образец изображение, которое я пытаюсь исправить в excel.... - person xdiver; 02.07.2014