Create a Cumulative Sum Column in MySQL

前端 未结 9 1943
青春惊慌失措
青春惊慌失措 2020-11-22 00:05

I have a table that looks like this:

id   count
1    100
2    50
3    10

I want to add a new column called cumulative_sum, so the table wou

相关标签:
9条回答
  • 2020-11-22 00:14
    select Id, Count, @total := @total + Count as cumulative_sum
    from YourTable, (Select @total := 0) as total ;
    
    0 讨论(0)
  • 2020-11-22 00:14

    select id,count,sum(count)over(order by count desc) as cumulative_sum from tableName;

    I have used the sum aggregate function on the count column and then used the over clause. It sums up each one of the rows individually. The first row is just going to be 100. The second row is going to be 100+50. The third row is 100+50+10 and so forth. So basically every row is the sum of it and all the previous rows and the very last one is the sum of all the rows. So the way to look at this is each row is the sum of the amount where the ID is less than or equal to itself.

    0 讨论(0)
  • 2020-11-22 00:16
      select t1.id, t1.count, SUM(t2.count) cumulative_sum
        from table t1 
            join table t2 on t1.id >= t2.id
        group by t1.id, t1.count
    

    Step by step:

    1- Given the following table:

    select *
    from table t1 
    order by t1.id;
    
    id  | count
     1  |  11
     2  |  12   
     3  |  13
    

    2 - Get information by groups

    select *
    from table t1 
        join table t2 on t1.id >= t2.id
    order by t1.id, t2.id;
    
    id  | count | id | count
     1  | 11    | 1  |  11
    
     2  | 12    | 1  |  11
     2  | 12    | 2  |  12
    
     3  | 13    | 1  |  11
     3  | 13    | 2  |  12
     3  | 13    | 3  |  13
    

    3- Step 3: Sum all count by t1.id group

    select t1.id, t1.count, SUM(t2.count) cumulative_sum
    from table t1 
        join table t2 on t1.id >= t2.id
    group by t1.id, t1.count;
    
    
    id  | count | cumulative_sum
     1  |  11   |    11
     2  |  12   |    23
     3  |  13   |    36
    
    0 讨论(0)
  • 2020-11-22 00:18
    UPDATE t
    SET cumulative_sum = (
     SELECT SUM(x.count)
     FROM t x
     WHERE x.id <= t.id
    )
    
    0 讨论(0)
  • 2020-11-22 00:19

    If performance is an issue, you could use a MySQL variable:

    set @csum := 0;
    update YourTable
    set cumulative_sum = (@csum := @csum + count)
    order by id;
    

    Alternatively, you could remove the cumulative_sum column and calculate it on each query:

    set @csum := 0;
    select id, count, (@csum := @csum + count) as cumulative_sum
    from YourTable
    order by id;
    

    This calculates the running sum in a running way :)

    0 讨论(0)
  • 2020-11-22 00:21

    Sample query

    SET @runtot:=0;
    SELECT
       q1.d,
       q1.c,
       (@runtot := @runtot + q1.c) AS rt
    FROM
       (SELECT
           DAYOFYEAR(date) AS d,
           COUNT(*) AS c
        FROM  orders
        WHERE  hasPaid > 0
        GROUP  BY d
        ORDER  BY d) AS q1
    
    0 讨论(0)
提交回复
热议问题