2015-03-03 2 views
0

У меня есть таблица под названием «Акции», как показано ниже.Баланс баланса с открытым балансом MySQL

+-----------+--------------+---------------+---------+ 
| client_id |  date |  credit | debit| 
+-----------+--------------+---------------+---------+ 
|   1 | 01-01-2015 |   50 |  0 | 
|   2 | 01-01-2015 |   250 |  0 | 
|   2 | 01-01-2015 |   500 |  0 | 
|   2 | 02-01-2015 |    0 |  500 | 
|   1 | 02-01-2015 |    0 |  40 | 
|   1 | 02-01-2015 |    0 |  80 | 
|   3 | 05-01-2015 |   3000 |  0 | 
|   2 | 06-01-2015 |    0 |  350 | 
|   4 | 06-01-2015 |    0 | 1000 | 
|   4 | 06-01-2015 |    0 | 2000 | 
|   4 | 07-01-2015 |   500 |  0 | 
|   5 | 07-01-2015 |   500 |  0 | 
|   5 | 08-01-2015 |   500 |  0 | 
|   1 | 09-01-2015 |    0 |  100 | 
+-----------+--------------+---------------+---------+ 

В результате я ожидал что-то вроде:

+---------+-----------+-------------+--------+---------+----------+ 
|client_id| date  |Open_Balance | credit | debit | balance | 
+---------+-----------+-------------+--------+---------+----------+ 
|  1 |01-01-2015 |   0 |  50 |  0 |  50 | 
|  1 |02-01-2015 |   50 |  0 |  40 |  10 | 
|  1 |02-01-2015 |   10 |  0 |  80 |  -70 | 
|  1 |09-01-2015 |   -70 |  0 |  100 |  -170 | 
|  2 |01-01-2015 |   0 | 250 |  0 |  250 | 
|  2 |01-01-2015 |   250 | 500 |  0 |  750 | 
|  2 |02-01-2015 |   750 |  0 |  500 |  250 | 
|  2 |06-01-2015 |   250 |  0 |  350 |  -100 | 
|  3 |05-01-2015 |   0 | 3000 |  0 |  3000 | 
|  4 |06-01-2015 |   0 |  0 | 1000 | -1000 | 
|  4 |06-01-2015 |  -1000 |  0 | 2000 | -3000 | 
|  4 |07-01-2015 |  -3000 | 500 |  0 | -2500 | 
|  5 |07-01-2015 |   0 | 500 |  0 |  500 | 
|  5 |08-01-2015 |   500 | 500 |  0 |  1000 | 
+---------+-----------+-------------+--------+---------+---- -----+ 

мне нужен баланс и «Открытые остатки» должны быть рассчитаны на client_id и хронологическом порядке, как показано выше. Пожалуйста помоги.

+3

сначала попробуйте что-то –

+0

, как вы рассчитываете 'Открытые балансы''? – Saif

+0

Начальный «открытый баланс» равен нулю для каждого client_id. –

ответ

1

Вот как вы можете это сделать ..

select 
s.client_id, 
s.date, 
s.op_balance as Open_Balance, 
s.credit, 
s.debit, 
s.balance 
from 
(
    select 
    t.client_id, 
    t.date, 
    t.credit, 
    t.debit, 
    @tot_credit := if(@prev_client = t.client_id, @tot_credit + t.credit,t.credit) as tot_cred, 
    @tot_debit := if(@prev_client = t.client_id,@tot_debit + t.debit,t.debit) as tot_deb, 
    @cur_bal := if(@prev_client = t.client_id, @tot_credit - @tot_debit,t.credit-t.debit) as balance, 
    (@cur_bal + t.debit) - t.credit as op_balance, 
    @prev_client := t.client_id 
    from(
    select * from stock order by client_id,date 
)t,(select @prev_client:=0,@cur_bal:=0,@tot_credit:=0,@tot_debit:= 0,@open_balance:=0)r 
)s 

DEMO

Кроме того, я заметил, что те же данные, у вас есть столбец даты, которые я использовал, чтобы сделать вид каждого идентификатора клиента, но его хорошо иметь дату и время на дату, чтобы сортировка не путалась с той же датой или может быть первичным ключом в таблице.

+0

Спасибо Абхик Чакраборти, он отлично работает. –

2

Прежде всего, установите две переменные для открытого баланса и баланса;

mysql> set @balance = 0; 

mysql> set @openBalance = 0; 

затем установить идентификатор переменной

mysql> set @id := (select client_id from Stock order by client_id asc limit 1); 

и теперь запустить этот запрос

select client_id,date,IF([email protected],@balance:[email protected],@balance:=0), 
@openBalance:[email protected] as OpenBalance,credit,debit,@balance:=([email protected])-debit as 
bal,@id:=client_id from Stock order by client_id,date; 

Да, поскольку некоторые данные имеют ту же дату и идентификатор, запрос может работать по-другому, так пожалуйста сделать некоторые изменения в определении таблицы, например, а не в дате, вы можете сделать это датой и затем соответствующим образом отсортировать.

Смежные вопросы