获取每个月的交易余额

Posted

技术标签:

【中文标题】获取每个月的交易余额【英文标题】:Get transactions balance for each month 【发布时间】:2014-11-20 18:22:57 【问题描述】:

我有一个包含事务的 2 列表,其中存储了更改时间 (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 代码。 (例如从固定日期到现在)

编辑:

HERE IS SQL FIDDLE

【问题讨论】:

您可以按此处***.com/questions/4342370/… 进行分组 @Horst Walter:据我所知,这将在一个月内给我带来变化。要获得余额,您不仅需要对给定月份的所有先前值求和。 【参考方案1】:

你可以只 group byorder by 一个月吗?

更新:要获得运行总计,您必须将各个月份加入到一组按月份的总计中,匹配“小于或等于”:-

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

(注:未测试)

【讨论】:

据我所知,这将在一个月内给我带来变化。要获得余额,您不仅需要对给定月份的所有先前值求和。 有趣,但是在第三个子查询之后我的大脑溢出了,所以我需要检查一下。我不能投票给你,因为我没有足够的声誉,对不起。 我无法让它工作。我更新了我的问题以使其更清楚。

以上是关于获取每个月的交易余额的主要内容,如果未能解决你的问题,请参考以下文章

可可绑定:更改时获取旧值

以太坊交易:为啥交易后余额没有变化?

从余额交易中获得条纹支付

交易表中的历史余额

交易表中的用户余额

MySQL算法更新银行交易(最终余额)