我想创建一个程序,为来自给定部门编号(COMM
)的员工设置commision(DEPTNO
),其薪水(SAL
)低于avarage SAL
DEPTNO
我写了以下程序:
CREATE PROCEDURE test1
@deptno INT
AS
BEGIN
DROP TABLE #emps
DECLARE @avg INT
SELECT @avg = AVG(SAL) FROM EMP WHERE DEPTNO = @deptno
SELECT
RowNum = ROW_NUMBER() OVER(ORDER BY EMPNO)
,*
INTO #emps
FROM EMP
DECLARE @MaxRownum INT
SET @MaxRownum = (SELECT MAX(RowNum) FROM #emps)
DECLARE @Iter INT
SET @Iter = (SELECT MIN(RowNum) FROM #emps)
WHILE @Iter <= @MaxRownum
BEGIN
SELECT *
FROM #emps
WHERE RowNum = @Iter
SET COMM = SAL * 0,05 IF DEPTNO = @deptno AND SAL < @avg
SET @Iter = @Iter + 1
END
END
但似乎它在循环中失败了。我从来没有在SQL中的任何循环之前使用过。我该如何解决这个问题?
答案 0 :(得分:2)
这里真的不需要循环。通过练习,您可以逐行思考,在SQL中进行思考。
with cteDeptAvg AS (
SELECT deptno, AVG(sal) as AverageSalary
FROM emp
GROUP BY deptno
)
UPDATE e
SET comm = sal * 0.05
FROM emp e
INNER JOIN cteDeptAvg da
ON e.deptno = da.deptno
WHERE e.sal < da.AverageSalary
AND e.deptno = @deptno;
答案 1 :(得分:2)
失败怎么样?是抛出错误还是不输出预期的数据?
首先,你有COMM = SAL * 0,05,我认为应该是0.05。这应该修复错误,除非您的代码中实际上没有错误。
通常,当您尝试在SQL中迭代结果集时,您希望使用游标:http://www.tutorialspoint.com/plsql/plsql_cursors.htm