2017-09-28 11 views
0

특정 조건에 따라 보존을 사용하여 변수를 요약하려고합니다. account_id, date, transaction, value 및 transaction_type 필드가 있습니다.보유 변수가 보유되지 않음

데이터는 ACCOUNT_ID 날짜 나하지 ('A')

의 첫 번째 TRANSACTION_TYPE 때까지 값을 요약 할

으로 분류되어 나는이

data dset; 
    set dset; 
    by account_id; 
    retain sum_flag sum; 
    if first.account_id then do; 
     sum_flag = 1; 
     sum=0; 
    end; 
    if transaction_type not in ('A') then sum_flag = 0; 
    if sum_flag = 1 then sum=sum +value; 
run; 

내 문제가 있습니다 A의 첫 번째 transaction_type이 잘 작동하지만 다음 transaction_type이 또한 sum_flag 인 경우. 1로 유지되는 대신에 왜 이런 일이 일어나는가?

transaction_type이 ('A')가 아니고 sum_flag = 0 인 경우 과 관련이 있다고 생각합니다. 트랜잭션이 'A'인 경우 sum_flag 변수가 누락으로 재설정되지 않지만 첫 번째 'A'트랜잭션까지 보유 된 값만 원합니다.

+0

문제를 설명하는 예제 데이터를 게시하십시오. 또한 입력 데이터를 덮어 쓰고 있기 때문에 SUM 및 SUM_FLAG이 입력 데이터의 변수가 아닌지 확인하십시오. 그렇다면 SET 문이 실행될 때 값을 덮어 쓰게되므로 RETAIN은 쓸모가 없습니다. – Tom

+0

누락으로 설정되는 이유는 알 수 없습니다. 일부 더미 데이터에 대한 코드를 테스트 한 결과 괜찮 았습니다. – user2877959

답변

0

두 가지 일이 발생할 수 있습니다.

  1. 출력 데이터 세트 이름은 입력 데이터 세트 이름과 동일합니다 (잘못된 방식 -하지 마세요). 실수로 한 번 실행 한 경우 테이블의 값이 예기치 않은 값으로 변경되어 수정 된 코드가 실패한 것처럼 보일 수 있습니다. 이 문제를 해결하려면 처음부터 다시 실행하고 출력 데이터 세트 이름을 다른 것으로 변경하십시오.
  2. value 필드에 null이 포함될 수 있습니까? 그렇다면 + 연산자가 문제의 원인입니다. + 연산자는 인수 중 하나가 null 인 경우 항상 NULL을 반환합니다. 대신 sum() 기능을 사용하십시오. 즉 if sum_flag = 1 then sum=sum(sum,value);
0

아마도이 문제를 해결하기 위해 인바운드 dset에 이전 반복의 추가 변수가 있습니다.

DOW 루프 접근 방식도 작동하며 유지 또는 초기화가 필요하지 않은 경우.

data dset; 
input group type $ value; 
datalines; 
1 A 1 
1 A 2 
1 A 3 
1 A 4 
1 B -5 
1 A 8 
2 A 0 
2 A 9 
2 A 33 
3 B 9 
; 
run; 

data dset; 
    sum = .; _summing=1; 
    do until (last.group); 
    set dset; 
    by group; 

    _summing = _summing and (type = 'A'); 
    if _summing then sum + value; 

    output; 
    end; 
    drop _:; * dont keep state variables; 
run;