2012-11-13 28 views
4

宏變量循環有一個這樣的例子:我如何通過SAS

proc sql; 
select dealno into :deal_no 
from deal_table; 

現在我要遍歷變量deal_no現在含表deal_table所有dealno,但我不知道該怎麼辦它。

+2

請告訴我們你要做什麼用這個。雖然遍歷宏變量列表當然有一些合理的理由,但幾乎所有的時候都有使用現有數據步驟編程方法的更好的解決方案。 – Joe

+0

我想獲取物品清單,然後檢查每個物品是否符合指定條件。例如: %宏循環; ---使用循環這裏檢索列表中的項目--- 插入表my_table select * from your_table where deal_id not in(item) %修復; – trisas

+0

如果這就是你想要做的,那麼在SQL或數據步驟中執行,而不使用宏變量循環。以宏觀語言循環幾乎總是錯誤的 - 這是緩慢而緩慢的做法。如果你只是這樣做了一次,那麼Keith的解決方案會更好 - 在一個宏變量中獲取所有值。如果你正在做一些複雜的連接插入,它無疑可以在SQL或沒有宏的數據步驟中完成。 – Joe

回答

5

如果你

%put &deal_no; 

你可以看到,它僅包含的dealno的第一個值,不是所有的人。 爲避免你可以做這樣的事情:

proc sql; 
    create table counter as select dealno from deal_table; 
    select dealno into :deal_no_1 - :deal_no_&sqlobs 
    from deal_table; 
quit; 

%let N = &sqlobs; 

%macro loop; 
%do i = 1 %to &N; 
    %put &&deal_no_&i; 
%end; 
%mend; 

%loop; run; 
+0

精彩的解決方案Dejan ....榮譽 – LonelySoul

6

另一種選擇是加「分隔」的SQL代碼,這將分隔符添加到值。然後,您可以在數據步驟中使用SCAN功能,或者在宏中使用%SCAN來循環訪問這些值並執行所需的任何任務。下面的例子。

proc sql noprint; 
select age into :age separated by ',' 
from sashelp.class; 
quit; 

%put &age.; 

data test; 
do i=1 by 1 while(scan("&age.",i) ne ''); 
    age=scan("&age.",i); 
    output; 
end; 
drop i; 
run; 
2

這是另一種解決方案。

proc sql noprint; 
    select age into :ageVals separated by ' ' 
    from ageData; 
quit; 

%put &ageVals; 

%macro loopAgeVals; %let i = 1; %let ageVal = %scan(&ageVals, &i); 

    %do %while("&ageVal" ~= ""); 
    %put &ageVal; 

    %let i = %eval(&i + 1); 
    %let ageVal = %scan(&ageVals, &i); 
    %end; 

%mend; 

%loopAgeVals;