2017-09-28 213 views
0

我想總結一個基於某些條件使用保留的變量。我有這些字段account_id,日期,交易,價值和transaction_type。保留的變量不被保留

的數據由ACCOUNT_ID和日期

我要總結的值,直到第一TRANSACTION_TYPE不是(「A」)

排序我有這個

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')then sum_flag = 0; 沒有它,變量sum_flag沒有被重置爲丟失,如果事務處於'A'中,但我只希望該值保留到第一個非'A'事務。

+0

發佈示例數據來說明問題。另外,由於您正在覆蓋您的輸入數據集,您是否確定SUM和SUM_FLAG在輸入數據中不是變量?如果是這樣,那麼RETAIN是無用的,因爲SET語句運行時這些值將被覆蓋。 – Tom

+0

我沒有看到他們將被設置爲失蹤的原因。我在一些虛擬數據上測試了你的代碼,它總結得很好。 – user2877959

回答

0

這裏可能發生兩件事情。

  1. 您輸出的數據集名稱與輸入數據集名稱相同(不正確的做法 - 不要這樣做)。如果您錯誤地運行它,它可能會將表中的值更改爲意外的值,然後使正確的代碼看起來像失敗。要解決這個問題,只需從頭開始重新運行,然後將輸出數據集名稱更改爲其他名稱。
  2. 您的value字段有時可能包含空值?如果是這樣,+運營商正在造成你的問題。如果其中一個參數爲空,則+運算符將始終返回NULL。請使用sum()函數。即if sum_flag = 1 then sum=sum(sum,value);
0

Tom可能是正確的,入站dset有更多的變量從你以前的迭代試圖解決這個問題。

DOW循環方法也可以工作,並且不需要保留或初始化if。

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;