2017-12-17 16 views
0

이 예에서는 다른 직원의 급여와 보너스가 while 루프에 혼합되어있어 계산이 유효하지 않습니다.while 루프에서 독립적으로 열 ID를 반복하는 방법

각 ID를 독립적으로 반복하고 해당 ID를 기반으로 특정 계산을 수행하는 방법은 무엇입니까?

while (select count(*) from db.employee) > 0 
begin 
    select top 1 ID, SALARY, [month] 
    from db.employee 
    order by [month] asc 

    if deserve = yes 
    begin 
     set SALARY = SALARY + (bonus * 2) 
    end 
end 

이것은 내 스크립트가 아닙니다. 복잡한 스크립트가있어서 목표를 이해하는 데 시간이 걸릴 것입니다. 그러나, 나는이 간단한 생각에 대한 논리를 모방합니다. 그래서 나중에 제안에 따라 원래의 스크립트를 조정할 수 있습니다. 원래 하나는 Iterate through tables and do calculation based on one column SQL server

답변

0

여러 가지 방법으로 수행 할 수 있습니다.

처음에는 왜 정상적인 업데이트를 수행하지 않는지 궁금합니다.

update emp 
set salary = emp.salary + (bonus * 2) 
from employee emp 
join bonuses bon on bon.employee_id = emp.employee_id 
where bon.deserved = 1 

또 다른 방법은 커서를 사용하는 것입니다,하지만 사람들은 때문에 성능 문제의 그들처럼 정말하지 않습니다 : https://docs.microsoft.com/en-us/sql/t-sql/language-elements/declare-cursor-transact-sql

또 다른 방법은, 동안 직원 수를 보유하는 컨테이너를 생성하는 것입니다 현재 반복이 카운트와 같지 않고 각 루프에서 필요한 직원을 잡아 당기는 동안 (예 :

declare @employeecount int = (select count(*) from employee) 
declare @current int = 1 

while @current <= @employeecount 
begin 

    declare @employeeid uniqueidentifier = (select top 1 employee_id from (select top (@current) * from employee order by employee_id asc) tmp order by employee_id desc) 

    -- Grab Employee and run logic 

set @current = @current + 1; 
end 

하단은 거의 커서가하는 일을 처리하지만 커서가 더 잘 수행하는 것으로 나타났습니다.

내가 최근에 한 일은 다음과 같습니다. 나는 따라하기 쉽다는 것을 알았다.

declare @ids table (id uniqueidentifier) 
insert into @ids 
select employee_id 
from employee 

while (select count(*) from @ids) > 0 
begin 

    declare @employeeid uniqueidentifier = (select top 1 employee_id from @ids) 

    -- Grab Employee and run logic 

delete from @ids where id = @employeeid 
end 
+0

내가 마지막으로 좋아하지만, 몇 가지 문제가있는 것으로 보입니다. 반복은 각 ID에 없으며 일부 보너스는 ID 사이에 섞여있을 수 있습니다. – jou

+0

나는 비슷한 것을하고 싶다. (employee_id desc로 employee_id 오름차순으로 employee order from (current value)를 선택한다. 나는 다른 방법을 사용했는데, 큰 코드에서 더 쉽게 읽고 더 쉽게 찾을 수 있습니다. – Monofuse

+0

당신의 논리를 시험해 보겠습니다. – jou