0

我需要分别获得 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(); 
4

1 回答 1

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;

这些不是非常灵活。除非您有非常明确命名的变量,否则它们不会按原样工作。我怀疑您更有可能想要进行某种数据步骤预处理,但是如果没有关于变量如何命名的更多细节(即,它们之间是否存在关系),这很难解释。

于 2012-11-25T02:59:44.967 回答