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 に答える