2012-11-25 99 views
0

else語句,我需要得到的百分比爲75個值75列分別。我想使用一個do循環,所以我不需要75次硬編碼。有一些條件,所以會有一個where語句。SAS如果再與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

你可以發佈更多的數據步驟,並使用代碼標籤來格式化您的文章,請 – sasfrog

+0

爲什麼你的角色後面的編輯?你在這裏是新來的,所以你可能不熟悉這個風格,但是代碼應該被格式化,並且沒有必要包含諸如請求幫助之類的東西 - 這就是我們來到這裏的原因! – itzy

+0

嗨@sasfrog,我真的沒有一個數據步驟,因爲我是新來的薩斯(也是該網站)。因此,我想知道它是否可以在SAS中完成。 – Beanie

回答

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; 

這些不是非常靈活;除非你有非常明確的命名變量,否則它們將不能工作。你更可能想要做一些我懷疑的數據步驟預處理,但如果沒有關於變量如何命名的細節(即它們之間是否存在關係),這很難解釋。

+0

嗨,感謝喬,那很棒。基本上我想要做的是低於 – Beanie

+0

Poc SQL; 創建表Work.Rsults AS 選擇/ * * A_01 /(情況下,當(SUM(t1.SAM_A_01))> 0,則(SUM(T1。SAM_A_01))/(SUM(t1.SAM_V_INSP)))* 100 0別的端)AS A_01 FROM T1結果LEFT JOIN組織T2 ON \t \t(t1.SAM_V_ID = t2.ORG_ID) LEFT JOIN時刻t3 ON \t \t(t1.SAM_T_ID = t3.TIM_ID) RIGHT JOIN T_ITEM T4 ON \t(T1 .SAM_A_01 = t4.T_NUM)AND (t1.SAM_A_02 = t4.T_NUM) WHERE t3.T_LEVEL = 'day' AND t3.T_START_DATE = '1JAN2012'dt AND t3.T_END_DATE =' 31DEC2012'dt 和T2 .V_LEVEL ='Internationl' AND t1.SAM_SUPP_PAID ='N' AND t1.SAM_T_TYPE = '本田' AND t4.T_NUM = 1 AND t4.T_TYPE = 'I'; QUIT; – Beanie

+0

表1 SAM有75列,全部爲A_01到A_75爲此我需要得到的百分比和表4(T_Item)具有colums T_NUM其中也有75值,我需要匹配表1 A_01到A_75。我不想硬編碼所以我想減少這一點。希望這是有道理的 – Beanie