2015-04-17 2 views
0

Я хотел бы создать процедуру, набор комисси (COMM) для работников из данного номера отдела (DEPTNO), который имеет более низкую зарплату (SAL), чем насчитайте 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

Есть ли причина того, что вы используете цикл? Кроме того, может возникнуть синтаксическая ошибка. Между 0 и 05 есть запятая после SET COMM = SAL * . Набор выборочных данных будет полезен. – Steven

ответ

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; 
+0

Существует проблема, следующая за выполнением запроса выполняет обновление для всех DEPTNO. Я хотел бы создать процедуру и выполнить ее на точный переданный DEPTNO. – Gregy

+0

@Gregy Я скорректировал свой ответ. –

+0

Это именно то, что я искал. Большое спасибо. – Gregy

2

Неудача как? Выбрасывает ошибку или просто не выводит данные, которые ожидали бы?

Во-первых, у вас COMM = SAL * 0,05, который, как я полагаю, должен быть 0,05. Это должно исправить ошибку, если эта ошибка не на самом деле в вашем коде.

Обычно, когда вы пытаетесь перебрать результирующий набор в SQL, который вы хотите использовать курсор: http://www.tutorialspoint.com/plsql/plsql_cursors.htm