Oracle中累计薪资计算需求:基于Emp表生成累计薪资结果
计算Emp表的累计薪资解决方案
嘿,我来帮你搞定这个累计薪资的计算问题!先明确下我们的基础数据和目标结果:
原始Emp表数据
| empno | ename | salary |
|---|---|---|
| 101 | Ram | 2000 |
| 102 | Kumar | 1000 |
| 103 | Mani | 3000 |
我们需要生成包含**累计薪资(Cumulative_Salary)**的结果,按empno顺序累加薪资。
方法一:使用窗口函数(推荐,适用于主流数据库)
现在大多数数据库(MySQL 8.0+、PostgreSQL、Oracle、SQL Server等)都支持窗口函数,这是最简洁高效的方式:
SELECT empno AS Empno, ename AS Ename, SUM(salary) OVER(ORDER BY empno) AS Cumulative_Salary FROM Emp ORDER BY empno;
逻辑解释:
SUM(salary) OVER(ORDER BY empno)是核心:它会按照empno的排序顺序,逐行累计计算薪资总和。- 第一行(empno=101):仅累加自身薪资,结果为2000
- 第二行(empno=102):累加101+102的薪资,结果为3000
- 第三行(empno=103):累加101+102+103的薪资,结果为6000
执行后就能得到你想要的结果:
| Empno | Ename | Cumulative_Salary |
|---|---|---|
| 101 | Ram | 2000 |
| 102 | Kumar | 3000 |
| 103 | Mani | 6000 |
方法二:子查询方式(适用于不支持窗口函数的老版本数据库)
如果你的数据库是老版本(比如MySQL 5.x)不支持窗口函数,可以用子查询实现:
SELECT e1.empno AS Empno, e1.ename AS Ename, (SELECT SUM(e2.salary) FROM Emp e2 WHERE e2.empno <= e1.empno) AS Cumulative_Salary FROM Emp e1 ORDER BY e1.empno;
逻辑解释:
- 对于每一行
e1,子查询会找出所有empno小于等于当前行empno的记录,计算它们的薪资总和,从而得到累计值。
内容的提问来源于stack exchange,提问作者Ram




