2014-11-20 2 views
0

У меня есть таблица с двумя столбцами с транзакциями, в которых сохраняется время изменения (unix_time) и значение изменения.Получить баланс операций за каждый месяц

create table transactions ( 
    changed int(11), 
    points int(11) 
); 

insert into transactions values (UNIX_TIMESTAMP('2014-03-27 03:00:00'), +100); 
insert into transactions values (UNIX_TIMESTAMP('2014-05-02 03:00:00'), +100); 
insert into transactions values (UNIX_TIMESTAMP('2015-01-01 03:00:00'), -100); 
insert into transactions values (UNIX_TIMESTAMP('2015-05-01 03:00:00'), +150); 

Чтобы получить текущий баланс вы должны суммировать все значения и получить баланс из прошлого вам нужно суммировать, если время изменения для этого значения меньше просил, как:

select 
    sum(case when changed < unix_timestamp('2013-12-01') then 
      points 
     else 
      0 
     end) as cash_balance_2013_11, 
... 

так для каждого месяц должен быть отдельный код SQL. Я хотел бы иметь код SQL, который даст мне балансы на все месяцы. (Например, с фиксированной датой до сих пор)

EDIT:

HERE IS SQL FIDDLE

+0

Вы можете пополнить счет с интервалом в http://stackoverflow.com/questions/4342370/grouping-into-interval-of-5-minutes-within-a-time-range –

+0

@ Horst Walter: Насколько я могу себе представить, это даст мне изменения в течение одного месяца. Чтобы получить баланс, вам нужно суммировать все предыдущие значения не только с данного месяца. – Pueblo

ответ

0

Может вы просто group by и order by месяц?

UPDATE: получить нарастающие итоги вы должны присоединиться отдельные месяцы к набору сумм за месяцем, соответствующий на «меньше или равно»: -

select 
    m.single_month 
    , sum(month_of_change.total_points) as running total_by_month 
from 
(
    select 
     sum(points) as total_points 
     , month_of_change 
    from 
    (
    select 
     points 
     , MONTH(FROM_UNIXTIME(t.time_of_change)) as month_of_change -- assumes unix_time 
    from mytable t 
    ) x 
    group by month_of_change 
) monthly_totals 
inner join 
(
    select distinct MONTH(FROM_UNIXTIME(t.time_of_change)) as single_month 
) m 
on monthly_totals.month_of_change <= m.single_month 
group by m.single_month 

(NB: не проверено)

+0

Насколько я могу себе представить, это даст мне изменения в течение одного месяца. Чтобы получить баланс, вам нужно суммировать все предыдущие значения не только с данного месяца. – Pueblo

+0

Интересно, но мой мозг переполнен после третьего подзапроса, поэтому мне нужно это проверить. Я не могу проголосовать за вас, поскольку у меня недостаточно репутации, извините. – Pueblo

+0

Я не смог заставить его работать. Я обновил свой вопрос, чтобы сделать его более понятным. – Pueblo

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