2017-02-22 62 views
1

У меня есть 2 таблицы AmountIn и AmountOut.Расчет балансировки SQL Упорядочено по дате

Первая таблица Amountin выглядит следующим образом:

AmountIn

+--------+--------------+-----------+ 
| account| date   | AmountIn | 
+--------+--------------+-----------+ 
| A  | 2017/2/6 | 200  | 
| A  | 2017/2/5 | 100  | 
| A  | 2017/2/5 | 500  | 
| B  | 2017/2/1 | 1000  | 
| B  | 2017/2/1 | 2000  | 
| C  | 2017/1/20 | 25  | 
+--------+----+---------+-----------+ 

И второй один выглядит следующим образом:

AmountOut

+--------+--------------+-----------+ 
| account| date   |AmountOut | 
+--------+--------------+-----------+ 
| A  | 2017/2/8 | 200  | 
| A  | 2017/2/7 | 100  | 
| A  | 2017/2/6 | 500  | 
| B  | 2017/2/2 | 1000  | 
| B  | 2017/2/1 | 2000  | 
| C  | 2017/1/20 | 25  | 
+--------+----+---------+-----------+ 

Теперь я хочу запрос, который будет отображаться результат: ForAccountA

+--------+--------------+----------+-----------+------------+ 
| account| date   | AmountIn | AmountOut | Balancy | 
+--------+--------------+-------- -+-----------+------------+ 
| A  | 2017/2/8 | 0  | 200  | 0   | 
| A  | 2017/2/7 | 0  | 100  | 200  | 
| A  | 2017/2/6 | 200  | 0   | 300  | 
| A  | 2017/2/6 | 0  | 500  | 100  | 
| A  | 2017/2/5 | 100  | 0   | 600  | 
| A  | 2017/2/5 | 500  | 0   | 500  | 
+--------+----+---------+----------+-----------+------------+ 

это означает для объединения обеих таблиц и вычислить balancy как:

last balance + AmountIn - AmounOut 

Мой код:

select 
    t.*, 
    @sum := if(@account = account, 
       @sum + AmountIn - AmountOut, 
       if((@account := account) is not null, 
        AmountIn - AmountOut, 0) 
      ) balance 
from (
    select 
     * 
    from (
     select 
      1 x, 
      account, 
      date, 
      AmountIn, 
      0 AmountOut 
     from AmountIn 
     union all 
     select 
      0 x, 
      account, 
      date, 
      0 AmountIn, 
      AmountOut 
     from AmountOut 
    ) t order by account, date, x 
) t cross join (select @account := null, @sum := 0) t2 

Но это дает мне результат на сегодняшний день восходящих я хочу, чтобы заказать по дате по убыванию. I neet o см. Последние операции сверху, иначе, когда данные получат lo, я буду трудно o прокрутить вниз или перейти на следующие страницы Пожалуйста, помогите

+2

неможет порядок по счету, дата по убыванию , x' – litelite

+0

, в этом случае «баланатность» будет беспорядочной, не корректной –

+0

Добавлен тег 'mysql', основанный на нестандартном синтаксисе –

ответ

1

Вот решение с балансом, который строит txn на txn. Я использую unionall (без присоединиться), чтобы построить исходную таблицу, как в вашем примере это кажется, что вы не хотите, строк с обеими amountin и amountout:

select * 
from (
select 
@cnt := If(@prev=account , @cnt+1,1) rown, a.*, 
@balance := if( @prev=account, @balance + amountin - amountout, amountin - amountout) balance,               
@prev := account prev from 
(select account, date, amountin, 0 amountout from amountin 
union all 
select account, date, 0, amountout from amountout) a, (select @cnt := 1) b, (select @prev :='') c, (select @balance :=0) bal 
order by account, date 
    ) r 
    order by account, rown desc, date desc 

Here is a working exmaple with your data

+0

Это прекрасно и красиво, спасибо большое, как насчет того, если в таблицах 3, добавим еще одна таблица «thirdTable», которая означает «balance = lastbalance + amountin + thirdamount-amountout», третья таблица имеет ту же структуру, что и другие –

+0

Еще раз спасибо, и жаль позднего +1, я был бы признателен, если бы мог дать, как будет выглядеть –