在MySQL中运行多个类别的求和

在MySQL中运行多个类别的求和,mysql,sql,cumulative-sum,Mysql,Sql,Cumulative Sum,我有一张表格 Category Time Qty A 1 20 B 2 3 A 3 43 A 4 20 B 5 25 我需要在MySQL中按类别计算一个运行总数。结果如下所示: Category Time Qty Ca

我有一张表格

 Category      Time      Qty  
     A           1        20 
     B           2         3
     A           3        43
     A           4        20
     B           5        25
我需要在MySQL中按类别计算一个运行总数。结果如下所示:

 Category      Time      Qty     Cat.Total  
     A           1        20         20
     B           2         3          3
     A           3        43         63
     A           4        20         83
     B           5        25         28

你知道我如何在MySQL中高效地实现这一点吗?我已经搜索了很多地方,但我能找到的只是关于如何在MySQL中插入一个运行总数的信息。我想知道是否有任何方法可以使用GROUP BY或类似的构造来实现这一点。

您可以在子查询中计算总和:

select  Category
,       Time
,       Qty
,       (
        select  sum(Qty) 
        from    YourTable t2 
        where   t1.Category = t2.Category 
                and t1.Time >= t2.Time
        ) as CatTotal
from    YourTable t1
select  Category
,       Time
,       Qty
,       CatTotal
from    (
        select  Category
        ,       Time
        ,       Qty
        ,       @sum := if(@cat = Category,@sum,0) + Qty as CatTotal
        ,       @cat := Category
        from    YourTable
        cross join
                (select @cat := '', @sum := 0) as InitVarsAlias
        order by
                Category
        ,       Time
        ) as SubQueryAlias
order by
        Time
以可读性换取速度,您可以使用MySQL变量来保存运行总和:

select  Category
,       Time
,       Qty
,       @sum := if(@cat = Category,@sum,0) + Qty as CatTotal
,       @cat := Category
from    YourTable
cross join
        (select @cat := '', @sum := 0) as InitVarsAlias
order by
        Category
,       Time
需要订购才能使该结构正常工作;如果需要不同的顺序,请将查询包装在子查询中:

select  Category
,       Time
,       Qty
,       (
        select  sum(Qty) 
        from    YourTable t2 
        where   t1.Category = t2.Category 
                and t1.Time >= t2.Time
        ) as CatTotal
from    YourTable t1
select  Category
,       Time
,       Qty
,       CatTotal
from    (
        select  Category
        ,       Time
        ,       Qty
        ,       @sum := if(@cat = Category,@sum,0) + Qty as CatTotal
        ,       @cat := Category
        from    YourTable
        cross join
                (select @cat := '', @sum := 0) as InitVarsAlias
        order by
                Category
        ,       Time
        ) as SubQueryAlias
order by
        Time

它必须是一个连续的总数,还是可以一次计算出最终的总数?我需要这个@fredley的连续总数,你知道怎么做吗?假设我有和他一样的表格,这个方案的效果如何,没有考虑时间栏。它确实在一定程度上起作用。。。但是,随着时间的推移,计算出的总数是不起作用的,仅就类别而言是不起作用的我仍在研究解决方案。