Как обновить записи на основе суммы поля, а затем использовать сумму, чтобы вычислить новое значение в sql - PullRequest
0 голосов
/ 27 мая 2010

Вот что я пытаюсь сделать, просматривая записи.

Я бы хотел иметь более элегантное решение, если это возможно, поскольку я уверен, что это не лучший способ сделать это в 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

Thx

Ответы [ 3 ]

1 голос
/ 27 мая 2010

Это близко к тому, что вы хотите, но нужно будет немного настроить, как только вы ответите на мой комментарий о том, чего вы действительно пытаетесь достичь.

update #tt_trans 
    set n_hrs = CASE WHEN T2.totHrs>40 
                     THEN 40 
                     ELSE T2.totHrs END,
    ot_hrs= CASE WHEN T2.totHrs>40 
                 THEN T2.totHrs-40 
                 ELSE 0 END
FROM  #tt_trans trans T1
INNER JOIN (SELECT SUM(@nhrs) totHrs, EmpNum 
           FROM #tt_trans 
           WHERE can_have_ot=1 
           GROUP BY EmpNum) T2 ON (T1.EmpNum=T2.EmpNum)

WHERE can_have_ot = 1 
0 голосов
/ 27 мая 2010
update #tt_trans
    set n_hrs = case 
    when t2.totHrs > 40
    then n_hrs - (t2.totHrs -40)
    else n_hrs
    end,
    ot_hrs = case 
    when t2.totHrs > 40 
    then ot_hrs + (t2.totHrs -40)
    else ot_hrs
    end
    from #tt_trans t1
    join (select sum (n_hrs) as totHrs, emp_num from #tt_trans where can_have_ot =1 group by emp_num) t2 on t1.emp_num = t2.emp_num where t1.post_date = (select max(post_date)from #tt_trans where emp_num = t1.emp_num)

В основном я взял измененные часы последней даты в периоде и скорректировал их соответствующим образом. Спасибо вам обоим, кто ответил. Оба ответа привели меня к моему.

0 голосов
/ 27 мая 2010

Похоже, что вы выполняете итерацию, потому что вам нужно отслеживать общее количество часов для данного сотрудника по нескольким записям. Вместо этого вы можете использовать внутреннее выделение, чтобы суммировать часы для каждого сотрудника, и присоединить это выделение к своей таблице #tt_trans. Напишите свое обновление из этого объединения и поместите свою логику в операторы CASE для столбцов обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...