2014-05-18 2 views
0

Employee ID, Hours, is3ManDay와 같은 행이있는 Training이라는 테이블이 있습니다. 이 표에는 동일한 직원에 해당하는 여러 레코드가있을 수 있습니다.조건에 따라 테이블의 모든 행을 업데이트하십시오.

나는 각 직원 ID와 관련된 시간을 계산하고 난이

SELECT EMP_ID, SUM(HRS) AS TOTALHRS, is3ManDay 
from Training 
GROUP BY EMP_ID, is3ManDay 

작품처럼 완벽하게 정상적으로을했지만 지금은 is3ManDay를 업데이트 할하려면 다음 중 하나를 예를하거나 각 직원이 가지고있는 총 시간을 기준으로 없음

@Emp_ID int, 
@is3ManDay varchar(10) 
IF (SELECT SUM(Hrs) FROM Training WHERE Emp_ID = @Emp_ID) >= 36 
BEGIN 
    UPDATE Training 
    SET is3ManDay = 'Y' 
    Where Emp_ID = @Emp_ID 
END 
ELSE 
    UPDATE Training 
    SET is3ManDay = 'N' 
    Where Emp_ID = @Emp_ID 

이 것도 잘 작동하지만이 것은 수동으로 @Emp_ID를 변경하고 실용적이지 않은 저장 프로 시저를 실행해야합니다. 이 코드 덩어리에 루프를 포함 시키길 원하지만, @Emp_ID를 제거하면 동일한 값으로 모든 행이 업데이트됩니다. 선택된 ID가 없기 때문입니다.

WHILE (SELECT SUM(HRS) FROM Training) >= 36 
BEGIN 
    UPDATE Training 
    SET is3ManDay = 'Y' 
END 

나는 WHILE 문을 시험했지만 나에게 도움이되지 못했습니다.

답변

5

절차가 필요하지 않습니다. 사용 SQL :

UPDATE Training 
SET is3ManDay = 'Y' 
Where Emp_ID in 
(SELECT Emp_ID FROM Training HAVING SUM(Hrs) >= 36) 
+0

감사합니다! 나는 이것을 시도 할 것이다. SQL이 강력하다는 것을 전혀 알지 못했습니다. – Marmar

0
merge into Training x 
using (
    select emp_id, case when sum_hrs >= 36 
         then 'Y' else 'N' 
        end as is3ManDay 
    from (
     select emp_id, sum(hrs) as sum_hrs 
     from training 
     group by emp_id 
    ) 
) y 
    on x.emp_id = y.emp_id 
when matched then 
    update set is3ManDay = y.is3ManDay 
관련 문제