Running Sums for Multiple Categories in MySQL

前端 未结 1 1423
独厮守ぢ
独厮守ぢ 2020-12-09 13:33

I have a table of the form

 Category      Time      Qty  
     A           1        20 
     B           2         3
     A           3        43
     A              


        
相关标签:
1条回答
  • 2020-12-09 14:25

    You could calculate the sum in a subquery:

    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
    

    Trading readability for speed, you can use a MySQL variable to hold the running sum:

    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
    

    The ordering is required for this construct to work; if you need a different order, wrap the query in a subquery:

    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
    
    0 讨论(0)
提交回复
热议问题