2017-03-01 97 views
0
%macro get_names_into_macvar(name1=,into1=); 
    proc sql; 
    select name into :&into1 separated by ' ' 
     from column_names 
      where UPCASE(name) contains upcase("&name1"); 
      ; 
    quit; 
%mend; 
%get_names_into_macvar(name1=topic1, into1=topic1macvar); 
%get_names_into_macvar(name1=topic2, into1=topic2macvar); 

我有一個非常大的數據集,其瘋狂數量的列遵循簡單的格式。每列表示該主題的主題和不同的度量標準。列名看起來像 topic1_metric1,topic1_metric2 ....,topic5_metric15,... topic20_metric1如何使用宏和sas proc sql創建自定義宏變量?

我想要的是獲得每個給定主題(或公制)的所有列名稱的列表,並將其存儲在宏變量供將來使用。我已經從字典表中創建了列名稱表。當我自己運行上面的sql代碼時,它可以工作......但是複製粘貼和更改主題名稱並不是實現此目的的最有效方法。

proc sql; 
    select name into :topic1macvar separated by ' ' 
     from column_names 
      where UPCASE(name) contains upcase("topic1"); 
      ; 
    quit; 

我的問題在於創建自定義宏變量來存儲每個主題。

select name into :&into1 separated by ' ' 

上面的代碼段沒有解析成宏變量。我究竟做錯了什麼?

+0

是你的問題,你試圖在宏停止運行後使用這些宏變量?您當前的代碼沒有任何東西可以在GLOBAL宏作用域中生成宏變量。所以他們將是本地的,並在宏觀結束時消失。要測試在宏中添加%PUT以查看值是否實際存儲。 – Tom

回答

2

最有可能是你的麻煩是你正在使本地宏變量在宏結束時消失。

%macro get_names_into_macvar(name1=,into1=); 
    %if not %symexist(&into1) %then %global &into1 ; 
    proc sql noprint; 
    select name into :&into1 separated by ' ' 
     from column_names 
     where UPCASE(name) contains %upcase("&name1") 
    ; 
    quit; 
%mend; 
+0

問題解決! **謝謝** – Chris