Макрос Sas, если затем еще на основе входного параметра - PullRequest
0 голосов
/ 24 сентября 2018

Я пишу макрос SAS, который принимает два параметра, первый - имя набора данных, второй - строка, которая фактически определяет один из выходных столбцов:

%macro test(data, input_mth);
%if &comp_mth.=October %then %do;
cmp_basis=Last Fiscal End;
%end;
proc sql;
create table final as select &cmp_basis. as col1, data.col2 from data;
quit;
%mend;

%test(data, October);

в основном,Я передаю набор данных, и если я передам строку 'October', то на выходе будет показано 'Last Fiscal End;как первый столбец.Если я пройду в январе, он покажет «Начало календаря» и т. Д. И т. Д.

Блок% if выдает ошибку:

Statement is not valid or it is used out of proper order.

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

В вашем коде есть множество ошибок концепции оператора.Если вы дадите мне больше информации о том, что вам нужно, я помогу вам лучше.Но я пытаюсь понять вашу проблему, и я предложил два решения.

вариант I

%macro test(data, input_mth);

    %if &comp_mth. = "October" %then %do;
        cmp_basis = Last /*Fiscal End*/;
    %end;

    proc sql;
        create table final as select 
            "&cmp_basis." as col1, 
             col2
        from &data.;
    quit;

%mend;

%test(data, October);

вариант II

%macro test(data, input_mth);

    %if &comp_mth.=prv %then %do;
        %let cmp_basis = Last Fiscal End; /* this is a  Vector that contains string at Last, Fiscal and End*/
    %end;

    proc sql;
        create table final as select /* You create a table call final       */
        "&cmp_basis." as col1,       /* column call October                 */
        /* data.col2 */              /* this no have sense - what is this ? */
          col2                      /*Correct way to call col2 if it exists on data*/
        from &data.;                 /* Your data set, you call in macro    */
    quit;
%mend;

%test(data, October);
0 голосов
/ 27 сентября 2018

Просто прочитав ваш код по порядку, давайте определим некоторые проблемы.

Сначала ваш оператор %IF ссылается на макро-переменную COMP_MTH, которая не определена нигде в вашей программе.Я предполагаю, что вместо этого вы имели в виду один из ваших входных параметров.

%if &input_mth.=October %then %do;

Во-вторых, у вас есть операторы шага данных внутри вашего блока %DO/%END, но вы никогда не запускали шаг данных.Я предполагаю, что вы хотите создать макропеременную там.Поэтому используйте оператор %let.

%let cmp_basis=Last Fiscal End; 

Но вам также нужно определить эту макропеременную как локальную, иначе ваш макрос перезапишет любую макропеременную с таким же именем в среде вызывающей программы.

Вам также необходимо убедиться, что ваш макрос генерирует действительный код SAS.Таким образом, в вашем коде SQL у вас есть

select &cmp_basis. as col1

Но если мы просто заменим макропеременную на значение, которое вы присваиваете выше, мы приведем это бессмысленное утверждение:

select Last Fiscal End as col1

Я предполагаю, что вы хотелисоздайте здесь символьную переменную, поэтому добавьте кавычки, чтобы генерировать символьную константу.

select "&cmp_basis." as col1

У вас также есть логическая проблема.Какое значение вы хотите для COL1, когда это не октябрь?Один из способов справиться с этим - установить значение по умолчанию для макропеременной перед вашей логикой.Но, возможно, вы хотели использовать входной месяц?Поэтому, возможно, вам просто нужно добавить предложение %else?

Вы также никогда не используете свой другой входной параметр.Предположим, что вы хотите передать имя набора данных, который должен запрашивать SQL.Поэтому вы хотите использовать

from &data

Но тогда ваш псевдоним таблицы SQL в DATA.col2 никогда не будет определен.Поэтому обязательно присвойте псевдоним вашей входной таблице, или для этого простого запроса к одной таблице просто удалите псевдоним при обращении к имени столбца.

Итак, в итоге получается что-то вроде этого:

%macro test(data, input_mth);
%local cmp_basis;
%if &input_mth.=October %then %do;
  %let cmp_basis=Last Fiscal End;
%end;
%else %let cmp_basis=&input_mth;
proc sql;
create table final as
  select "&cmp_basis." as col1
       , x.col2
  from &data x
;
quit;
%mend test;

Для такой простой логики мы могли бы обойтись без дополнительной макропеременной и просто использовать макропрограмму для условного генерирования постоянного значения, которое вы хотите использовать в качестве значения COL1.

%macro test(data, input_mth);
proc sql;
create table final as
  select 
%if &input_mth.=October %then "Last Fiscal End";
%else "&input_mth";
    as col1
  , x.col2
  from &data x
;
quit;
%mend test;
0 голосов
/ 24 сентября 2018

Я понял, правильный синтаксис:

%macro test(data, input_mth);
%if &comp_mth.=prv %then %do;
%let cmp_basis=Last Fiscal End;
%end;
proc sql;
create table final as select "&cmp_basis." as col1, data.col2 from data;
quit;
%mend;

%test(data, October);
...