2014-11-20 3 views
1

나는 accrual_date, absence_type, employee_id 및 duration_days가 포함 된 테이블을 가지고 있습니다.proc sql을 사용하는 조건부 합

accrual_date  absence_type duration_days employee_id 
01JAN2001:00:00:00 010   10.20   1 
01JAN2001:00:00:00 014   11    1 
01JAN2002:00:00:00 015   30    2 
01JAN2001:00:00:00 015   20    2 

부재 중 유형에 대한 기간 당 duration_days를 합한 쿼리를 만들고 싶습니다.

proc sort data=sort_second out=test1 nodupkey; 
by emplid; 
quit; 

하지만이 코드가하는 것입니다 :

proc sql; 
create table sort_second as 
select 
     case when absence_type='014' then sum(duration_days) else . end as duration_days_014, 
     case when absence_type='015' then sum(duration_days) else . end as duration_days_015, 
     case when absence_type='010' then sum(duration_days) else . end as duration_days_010, 
     employee_id, absence_type 
    from sort_first 
    group by emplid; 

quit; 

그런 다음 중복 키를 제거 :

employee_id  duration_days_010 duration_days_014 duration_days_015 
1     10.20    11     . 
2     .     .     50 

은 employee_id입니다 당 duration_daysper의 absence_type을 포함하는 열을 추가 : 같은 결과는해야한다 그것이 014 또는 015 또는 010 인 것을 무시하고 모든 직원에게 추가하십시오. 좋아요 :

employee_id  duration_days_010 duration_days_014 duration_days_015 
    1     21.20    21.20   . 
    2     .     .     50 

무엇이 잘못되었는지 친절히 조언합니다. 미리 감사드립니다.

답변

1

먼저 SAS에 있다면 SAS 도구를 사용하는 것이 좋습니다.

이 경우 PROC FREQ 이상 (PROC TABULATE)으로 직접 처리 할 수 ​​있으며 데이터 집합을 원한다면 ODS OUTPUT으로 얻을 수 있습니다.

ods output table=want; 
proc tabulate data=have; 
where absence_type in (10,14,15); 
class absence_type employee_id; 
var duration_days; 
tables employee_id,absence_type*duration_days*sum; 
run; 

proc transpose data=want out=final prefix=duration_days_; 
by employee_id; 
id absence_type; 
var duration_days_sum; 
run; 

당신은 SQL을 고수 할 경우

, 당신이해야 할 일 경우 문이 작동 방법을 변경할 수 있습니다.
case when absence_type='014' then sum(duration_days) else . end as duration_days_014, 

sum(case when absence_type='014' then duration_days else . end) as duration_days_014, 

IE를해야합니다, 당신은 단지에 014 시간 일을 가지고 가상의 열을 합계를. 귀하의 예제에서 수행하는 작업은 모든 duration_days의 합계를 직원이 duration_days가있는 모든 열에 삽입하는 것입니다. 또한 위의 단계 대부분을 건너 뛸 수 있어야합니다. 초기 데이터 세트에서이 작업을 수행 할 수 있습니다.

proc sql; 
create table final as 
select 
     sum (case when absence_type=014 then duration_days else . end) as duration_days_014, 
     sum (case when absence_type=015 then duration_days else . end) as duration_days_015, 
     sum (case when absence_type=010 then duration_days else . end) as duration_days_010, 
     employee_id 
    from have 
    group by employee_id; 

quit; 
+0

효과가 있습니다. 무리 감사! :) SAS 도구에서 더 많은 것을 배우기를 바랍니다. –

+1

PROC SQL에서 부울 (1 또는 0)을 사용하여'sum (duration_days * (휴면 _ 유형 = 14))을 duration_14'처럼 조건부로 합계 할 수 있습니다. 'absence_type = 14'비트는 참이면 1로, 거짓이면 0으로 해석됩니다. 같은 것에 관해서, 나는 SQLs가 끔찍한 'CASE'보다 더 읽기 쉽다고 생각한다. –

+0

확실히 작동합니다. 나는 코드의 다른 독자들에게 그것이하는 일을 명확하게하기 때문에, 그 끔찍 함에도 불구하고, 케이스를 선호하는 경향이 있습니다. 불행히도 등호는 쉽게 놓칠 수 있습니다. – Joe