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 循环)的编程模式来处理。对于每个 by-group,初始化在循环之前,观察输出在循环之后。你能看到它的实际效果吗?这篇论文很旧,但必须阅读。

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 回答