SAS Select Into Dynami c Именование - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь использовать SAS pro c sql select into для 8 различных сценариев ios.

  %MACRO Loop();
     proc sql;
         %do i=1 %to 8;
         select total_value
         into :Sol_&i. separated by ','
         from Master.adjusted_hours
         where Solicitation = "&i.";
    %end;
quit;
%mend;

%Loop();

Однако, когда я использую функцию% put, переменная макроса не признал. Ошибка: «Очевидный символ c ссылка SOL_1 не разрешена».

  %put &Sol_1;

Как я могу сохранить значение в этой макропеременной и вызвать его позже в коде?

1 Ответ

1 голос
/ 10 июля 2020

Вам необходимо объявить SOL_1 SOL_2 и c как глобальные макропеременные. Я не был уверен, что было в ваших данных, поэтому я создал несколько фиктивных данных.

%global SOL_1 SOL_2 SOL_3 SOL_4 SOL_5 SOL_6 SOL_7 SOL_8;

data adjusted_hours;
    do x = 1 to 8;
        solicitation=put(x, 1.);
        do total_value = 1 to 10;
            output;
        end;
    end;
    drop x;
run;

%MACRO Loop();
 
     proc sql noprint;
     %do i = 1 %to 8;
         select total_value
         into : Sol_&i. separated by ','
         from adjusted_hours
         where Solicitation = "&i.";
     %end;
    quit;

%mend;

%Loop();

%put _USER_;
Partial log:
 
 GLOBAL SOL_1 1,2,3,4,5,6,7,8,9,10
 GLOBAL SOL_2 1,2,3,4,5,6,7,8,9,10
 GLOBAL SOL_3 1,2,3,4,5,6,7,8,9,10
 GLOBAL SOL_4 1,2,3,4,5,6,7,8,9,10
 GLOBAL SOL_5 1,2,3,4,5,6,7,8,9,10
 GLOBAL SOL_6 1,2,3,4,5,6,7,8,9,10
 GLOBAL SOL_7 1,2,3,4,5,6,7,8,9,10
 GLOBAL SOL_8 1,2,3,4,5,6,7,8,9,10

Если вы хотите полностью избежать макроса и объявлять глобальные переменные%, вот данные пошаговое решение, которое будет работать, пока ваш набор данных отсортирован по запросу.

data _null_;
    set adjusted_hours;
    by solicitation;
    format temp $50.;
    retain temp ;
    temp=CATX(',',temp, total_value);
    
    if last.solicitation then do;
        call symputx(CATS('SOL_', solicitation), temp);
        call missing(temp);
    end;
run;
...