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