SAS如果那么else语句与Do循环

时间:2012-11-25 01:57:18

标签: sql sas

我需要分别获得75列75个值的百分比。我想使用do循环,所以我不需要硬编码75次。有一些条件,所以会有一个where声明。

我没有正确地执行do循环,但我使用以下内容来获取百分比

case when (SUM(t1.sam)) >0 then
  ((SUM(t1.sam))/(SUM(t1.sam_Threshold)))*100
else 0
end

我尝试了下面的内容并且好一点:

data test;
i_1=4;
i_2=8;
i_3=4;
i_4=8;
V_ANN_V_INSP=24;
run;

%macro loop(); 
%let numcols=4; 
proc sql;
create table test3 as
select V_ANN_V_INSP,
%do i=1 %to &numcols;
(i_&i/V_ANN_V_INSP)*100 as i_&i._perc
%if &i<&numcols %then %do;,
%end;
%end;
from test;
quit;
%mend; 
%loop(); 

1 个答案:

答案 0 :(得分:2)

CASE WHEN是一个SQL语句,而不是数据步骤语句,因此您不能在那里使用DO循环。根据您正在做的事情,这里有很多可能的解决方案。发布其他代码有助于获得更准确的答案,但我可以给您一些建议。

首先,将其纳入数据步骤。然后你可以使用do循环。

data want;
set have;
array nums sam1-sam75;
array denoms threshold1-threshold75;
array pct[75];
do _t = 1 to dim(nums);
  pct[_t]=nums[_t]/denoms[_t];
end;
run;

其次,如果由于某种原因需要在SQL中执行此操作,则可以在预处理步骤中的宏或数据步骤中写出SQL代码。

%macro do_sql_st;
  %do _t = 1 to 75;
    case when (SUM(t1.sam&_t.)) >0 then
  ((SUM(t1.sam&_t.))/(SUM(t1.sam_Threshold&_t.)))*100
else 0
end
as pct&_t.
%end;
%mend do_sql_st;

proc sql;
select %do_sql_st from t1 where ... ;
quit;

这些不是非常灵活;除非你有非常具体命名的变量,否则它们不会按原样运行。我怀疑你更有可能想要进行某种数据步骤预处理,但如果没有更详细地说明变量的命名方式(即,如果它们之间存在关系),则很难解释。