Просто прочитав ваш код по порядку, давайте определим некоторые проблемы.
Сначала ваш оператор %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;