循环过程

时间:2015-04-17 19:41:27

标签: tsql

我想创建一个程序,为来自给定部门编号(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中的任何循环之前使用过。我该如何解决这个问题?

2 个答案:

答案 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