다음은 레코드 반복을 통해 수행하려고하는 작업입니다.필드 합계를 기준으로 레코드를 업데이트 한 다음 합계를 사용하여 SQL에서 새 값 계산
SQL에서이 작업을 수행하는 최선의 방법이 아니므로 가능하면보다 우아한 솔루션을 갖고 싶습니다.
set @counter = 1
declare @totalhrs dec(9,3), @lastemp char(7), @othrs dec(9,3)
while @counter <= @maxrecs
begin
if exists(select emp_num from #tt_trans where id = @counter)
begin
set @nhrs = 0
set @othrs = 0
select @empnum = emp_num, @nhrs = n_hrs, @othrs = ot_hrs
from #tt_trans
where id = @counter
if @empnum = @lastemp
begin
set @totalhrs = @totalhrs + @nhrs
if @totalhrs > 40
begin
set @othrs = @othrs + @totalhrs - 40
set @nhrs = @nhrs - (@totalhrs - 40)
set @totalhrs = 40
end
end
else
begin
set @totalhrs = @nhrs
set @lastemp = @empnum
end
update #tt_trans
set n_hrs = @nhrs,
ot_hrs = @othrs
where id = @counter and can_have_ot = 1
end
set @counter = @counter + 1
end
들으
잠시만 기다려주십시오. 기존 코드에는 꽤 심각한 로직 문제가 있다고 생각합니다. 총 직원 수와 정규 근무 시간을 결정하여 각 직원의 모든 시간을 합산하는 것 같습니다. 그런 다음 각 직원에 대한 마지막 레코드의 n_hrs (덮어 쓰기) 및 ot_hrs 열을 업데이트합니다. 나는 ypu'd가 그것을하고 싶어하는 상황을 상상할 수 없다. 그래서 무언가는 잘못입니다. 당신이하려는 일을 영어로 설명 할 수 있습니까? 아마도 테이블의 내용에 대한 예제를 전후로 제공하고 있을까요? – JohnFx
기본적으로 내가해야 할 일은 한 시간에 40 시간 이상을 지닌 모든 직원이 초과 근무를 한 사실을 감안하여 펀치를 조정하는 것입니다. 그것은 n_hrs를 철회하고 ot_hrs로 시간을 이동하여 총 시간을 동일하게 유지합니다. 최종 사용자는 ot_hrs (파산 일 때) (40 일)를 확인할 수 있어야합니다. – Casey
예
전에 EMP # 1 n_hrs ot_hrs 날짜
1 0 8.2 1 8.5 1/1
0 1/2 1 0 8.6 1 8.7 1/3
0 1/4 1 0 8.0 1/5 10.3 2 0 (1/1)
2 10.6 0
1/2 2 1/3 12.0 0 10.0 0
2 1/4
EMP 번호 n_hrs ot_hrs 날짜 이후
1 0 8.2 1 8.5 1/1
0 1/2 1 0 8.6 1/3
1 8.7 0 1/4
1 6.0 2.0 1/5
2 10.3 0 1/1
2 10.6 0 1/2
2 12.0 0 1/3
2 7.1 2.9 1/4 – Casey