使用MySQL在每个组中运行总计

时间:2018-05-28 16:34:37

标签: mysql sql running-total

我正在尝试编写一个SQL来计算以下输入中每个组中的运行总计。只是想知道如何使用MySQL来做到这一点。我知道如何使用分析函数在常规SQL中执行此操作,而不是在MySQL中。您能否分享一下如何实施它的想法。

SQL小提琴: http://sqlfiddle.com/#!9/59366d/19

使用窗口函数的SQL:

SELECT e.Id,
       SUM( e.Salary ) OVER( PARTITION BY e.Id ORDER BY e.Month  ) AS cumm_sal
  FROM Employee e 
LEFT JOIN
       (
          SELECT Id,MAX(Month) AS maxmonth
            FROM Employee
          GROUP BY Id
        ) emax
    ON e.Id = emax.Id
WHERE e.Month != emax.maxmonth
ORDER BY e.Id,e.Month DESC;    

输入:

Create table Employee (Id int, Month int, Salary int);

insert into Employee (Id, Month, Salary) values ('1', '1', '20');
insert into Employee (Id, Month, Salary) values ('2', '1', '20');
insert into Employee (Id, Month, Salary) values ('1', '2', '30');
insert into Employee (Id, Month, Salary) values ('2', '2', '30');
insert into Employee (Id, Month, Salary) values ('3', '2', '40');
insert into Employee (Id, Month, Salary) values ('1', '3', '40');
insert into Employee (Id, Month, Salary) values ('3', '3', '60');
insert into Employee (Id, Month, Salary) values ('1', '4', '60');
insert into Employee (Id, Month, Salary) values ('3', '4', '70');

输出:

| Id | Month | Salary |
|----|-------|--------|
| 1  | 3     | 90     |
| 1  | 2     | 50     |
| 1  | 1     | 20     |
| 2  | 1     | 20     |
| 3  | 3     | 100    |
| 3  | 2     | 40     |

1 个答案:

答案 0 :(得分:3)

在MySQL中,最有效的方法是使用变量:

select e.*,
       (@s := if(@id = e.id, @s + salary,
                 if(@id := e.id, salary, salary)
                )
       ) as running_salary
from (select e.*
      from employee e
      order by e.id, e.month
     ) e cross join
     (select @id := -1, @s := 0) params;

您也可以使用相关子查询执行此操作:

select e.*,
       (select sum(e2.salary)
        from employee e2
        where e2.id = e.id and e2.month <= e.month
       ) as running_salary
from employee e;