0

問題は、elseが実行されている場合、Sの増分が実行されないことです。何か案が?

data osszes_folyositas;
 set osszes_tabla;
 retain old_xname;
 retain s 0;

 if xname ne old_xname  then
 do;
  old_xname = xname; 
  s = 0;
 end;
 else
 do; 
  s = s + Foly_s_tott_t_rgyh_ban_HUF;
  delete;
 end;
run;
4

2 に答える 2

1

何をしようとしているのかわからない。ただし、レコードを「xname」で並べ替えており、「xname」のグループごとに値を合計したい場合は、次のことを試してください。

data sample;

    input xname$1-6 myvalue;

datalines;    
name01 5
name01 1
name02 3
name02 8
name02 4
name03 7
;

data result;
    set sample;
    by xname;

    retain s 0;

    if first.xname then s=0;
    s=s+myvalue;
    if last.xname then output;
run;

proc print data=result;
run;

これにより、「xname」の各グループの「s」がリセットされ、「s」がグループ全体の「myvalue」の合計に設定された最後のレコードが出力されます。結果は次のようになります。

Obs    xname     myvalue     s

 1     name01       1        6
 2     name02       4       15
 3     name03       7        7
于 2010-07-09T20:28:37.717 に答える
0

この種のタスクは、DoW(別名WhitlockのDoループ)と呼ばれるプログラミングパターンで最も適切に処理できます。グループごとに、初期化はループの前に行われ、観測出力はループの後に行われます。それが実際にどのように機能するかわかりますか?この論文は古いですが、必読です。

data sample;
   input xname$1-6 myvalue;
datalines;    
name01 5
name01 1
name02 3
name02 8
name02 4
name03 7
;
run;

proc sort data=sample;
   by xname;
run;

data result;
   if 0 then set sample; /* prep pdv */
   s = 0;   
   do until (last.xname);
      set sample;
      by xname;
      s + myValue;
   end;
run;

/* check */
proc print data=result;
run;
/* on lst
Obs    xname     myvalue     s

  1     name01       1        6
  2     name02       4       15
  3     name03       7        7
*/
于 2010-07-12T13:43:52.467 に答える