首页 > 试题广场 >

统计salary的累计和running_total

[编程题]统计salary的累计和running_total
  • 热度指数:129838 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
统计salaries表中to_date = "9999-01-01"的员工累计工资和running_total,举例:第三个员工的running_total为前两个员工的salary累计和,其他以此类推。
注意:running_total要的是对在职员工的salary进行cumulative sum,在职员工的筛选条件为to_date = "9999-01-01"
CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
输出格式:
emp_no salary running_total
10001 88958 88958
10002 72527 161485
10003 43311 204796
10004 74057 278853
10005 94692 373545
10006 43311 416856
10007 88070 504926
10009 95409 600335
10010 94409 694744
10011 25828 720572
示例1

输入

drop table if exists  `salaries` ; 
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO salaries VALUES(10001,60117,'1986-06-26','1987-06-26');
INSERT INTO salaries VALUES(10001,62102,'1987-06-26','1988-06-25');
INSERT INTO salaries VALUES(10001,66074,'1988-06-25','1989-06-25');
INSERT INTO salaries VALUES(10001,66596,'1989-06-25','1990-06-25');
INSERT INTO salaries VALUES(10001,66961,'1990-06-25','1991-06-25');
INSERT INTO salaries VALUES(10001,71046,'1991-06-25','1992-06-24');
INSERT INTO salaries VALUES(10001,74333,'1992-06-24','1993-06-24');
INSERT INTO salaries VALUES(10001,75286,'1993-06-24','1994-06-24');
INSERT INTO salaries VALUES(10001,75994,'1994-06-24','1995-06-24');
INSERT INTO salaries VALUES(10001,76884,'1995-06-24','1996-06-23');
INSERT INTO salaries VALUES(10001,80013,'1996-06-23','1997-06-23');
INSERT INTO salaries VALUES(10001,81025,'1997-06-23','1998-06-23');
INSERT INTO salaries VALUES(10001,81097,'1998-06-23','1999-06-23');
INSERT INTO salaries VALUES(10001,84917,'1999-06-23','2000-06-22');
INSERT INTO salaries VALUES(10001,85112,'2000-06-22','2001-06-22');
INSERT INTO salaries VALUES(10001,85097,'2001-06-22','2002-06-22');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'1996-08-03','1997-08-03');
INSERT INTO salaries VALUES(10002,72527,'1997-08-03','1998-08-03');
INSERT INTO salaries VALUES(10002,72527,'1998-08-03','1999-08-03');
INSERT INTO salaries VALUES(10002,72527,'1999-08-03','2000-08-02');
INSERT INTO salaries VALUES(10002,72527,'2000-08-02','2001-08-02');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,40006,'1995-12-03','1996-12-02');
INSERT INTO salaries VALUES(10003,43616,'1996-12-02','1997-12-02');
INSERT INTO salaries VALUES(10003,43466,'1997-12-02','1998-12-02');
INSERT INTO salaries VALUES(10003,43636,'1998-12-02','1999-12-02');
INSERT INTO salaries VALUES(10003,43478,'1999-12-02','2000-12-01');
INSERT INTO salaries VALUES(10003,43699,'2000-12-01','2001-12-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');

输出

emp_no|salary|running_total
10001|88958|88958
10002|72527|161485
10003|43311|204796
select emp_no,salary
,sum(salary) over(order by emp_no) runnong_total 
from salaries 
where to_date='9999-01-01';
发表于 2022-01-17 22:38:53 回复(0)
直接使用窗口函数进行累计求和
select emp_no,salary,sum(salary)over(order by emp_no ) running_total
from salaries
where  to_date = '9999-01-01'

发表于 2021-12-17 09:25:06 回复(0)

1、累计求和,通过两表连接排序求和
SELECT a.emp_no, a.salary, SUM(b.salary)
FROM salaries AS a, salaries AS b
WHERE a.emp_no>=b.emp_no
AND a.to_date = '9999-01-01'
AND b.to_date = '9999-01-01'
GROUP BY a.emp_no
ORDER BY a.emp_no ASC


发表于 2021-10-08 15:51:43 回复(0)

窗口函数即可

SELECT emp_no, salary, sum(salary) over(order by emp_no) AS running_total
FROM salaries
WHERE to_date='9999-01-01';
发表于 2021-10-06 19:51:46 回复(0)
select emp_no,salary,sum(salary) over(order by emp_no) as running_total
from salaries
where to_date = "9999-01-01"
order by emp_no;
发表于 2021-08-26 09:19:57 回复(0)
select s1.emp_no ,s1.salary,sum(s2.salary) as running_total from salaries as s1 join salaries as s2 on 
s1.emp_no >= s2.emp_no and s1.to_date = '9999-01-01' and s2.to_date = '9999-01-01' group by s1.emp_no 
order by s1.emp_no asc;
发表于 2021-08-18 15:13:36 回复(0)