MySQL基础之实现累加值

现有表 salary,如图1:

实现需求:按员工的编号升序生成一列累计值, 结果按累计值升序排序,实现结果如图2。

                  

                                图1.表 salary                                                                  图2.需要实现的结果

建表语句如下:

CREATE TABLE `salary` (
  `empno` int NOT NULL,
  `ename` varchar(255) DEFAULT NULL,
  `salary` decimal(10,2) DEFAULT NULL,
  PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

插入数据:

INSERT INTO salary(empno,ename,salary) VALUES(7934,'MILLER',1300.00);
INSERT INTO salary(empno,ename,salary) VALUES(7902,'FORD',3000.00);
INSERT INTO salary(empno,ename,salary) VALUES(7900,'JAMES',950.00);
INSERT INTO salary(empno,ename,salary) VALUES(7876,'ADAMS',1100.00);
INSERT INTO salary(empno,ename,salary) VALUES(7844,'TURNER',1500.00);
INSERT INTO salary(empno,ename,salary) VALUES(7839,'KING',5000.00);
INSERT INTO salary(empno,ename,salary) VALUES(7788,'SCOTT',3000.00);
INSERT INTO salary(empno,ename,salary) VALUES(7782,'CLARK',2450.00);
INSERT INTO salary(empno,ename,salary) VALUES(7698,'BLAKE',2850.00);
INSERT INTO salary(empno,ename,salary) VALUES(7654,'MARTIN',1250.00);
INSERT INTO salary(empno,ename,salary) VALUES(7566,'JONES',2975.00);
INSERT INTO salary(empno,ename,salary) VALUES(7521,'WARD',1250.00);
INSERT INTO salary(empno,ename,salary) VALUES(7499,'ALLEN',1600.00);
INSERT INTO salary(empno,ename,salary) VALUES(7369,'SMITH',800.00);

解法一:使用窗口函数

SELECT empno,ename,salary,sum(salary) over (ORDER BY empno) as sum FROM salary;

解法二:使用变量实现累加

set @sum :=0;
SELECT empno,ename,salary,(@sum := @sum + salary) as sum FROM salary ORDER BY empno;
SELECT s.empno,s.ename,s.salary,(@sum := @sum + salary) as sum 
FROM salary s,(SELECT @sum :=0) tmp ORDER BY empno;

解法三:使用标量子查询

SELECT b.empno,b.ename,b.salary,
(SELECT sum(a.salary) FROM salary a WHERE a.empno <= b.empno) as sum 
FROM salary b;

 解法四:自连接

SELECT s1.*, sum(s2.salary) as sum
FROM salary s1, salary s2
WHERE s1.empno >= s2.empno
GROUP BY s1.empno;

 

posted @ 2020-12-06 00:03  奇遇yms  阅读(984)  评论(0)    收藏  举报