mysql - 使用 MySQL 在每个组中运行总计
问题描述
我正在尝试编写一个 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 |
解决方案
在 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;
推荐阅读
- twitter-bootstrap - 如何将自定义模板中的数据发布到谷歌表单
- cassandra - Janusgraph 后端表的布局
- r - 通过添加 0 扩展数据帧
- python - 在 Python 中搜索二维列表中的元素
- c++ - 将非结构化数组转换为结构化数组(具有非编译时已知大小的结构)
- java - Android Mediaplayer空点异常(Java)
- c - 如何解决错误:预期标识符或 C 语言中的 '('
- javascript - Express 中间件中的异步/等待
- node.js - NodeJS - 错误:监听 EADDRNOTAVAIL:地址不可用
- delphi-7 - 如何在 Delphi 7 中使用 OnGetPassword 发送密码以建立 SSL 连接