Я хочу добавить макрос, который используется как часть стандартного процесса.Макрос в настоящее время объединяет несколько наборов данных из разных групп продуктов, как показано ниже:
%macro test(group=);
data X;
set
%if &group = AAA %then %do;
LIB.AAA1
LIB.AAA2
LIB.AAA3
%end;
%else %if &group = BBB %then %do;
LIB.BBB1
LIB.BBB2
LIB.BBB3
%end;
%else %if &group = CCC %then %do;
LIB.CCC1
LIB.CCC2
LIB.CCC3
%end;
;
by customer key var1 var2;
if first.customer then do;
<logic>
end;
run;
%mend;
Я пытаюсь достичь, вставив свой собственный набор данных и сохранив его порядок для удовлетворения нового требования.Я также должен сделать это, изменяя как можно меньше стандартного макроса, описанного выше, чтобы не влиять на остальные данные и последующие процессы.
В отдельной программе, запускаемой перед этим макросом, яЯ отсортировал набор данных с дополнительной переменной в диапазоне от customer
до key
.Если я просто отсортирую по переменным, указанным выше, мой набор данных будет в неправильном порядке, что даст неправильные first.customer
результаты из макроса test
.Эта дополнительная переменная type
не существует ни в одном из других наборов данных.Я мог бы использовать существующую переменную, но если я не смогу ее также изолировать, это повлияет на порядок других наборов данных, к которым я не хочу прикасаться.
Код, который у меня пока есть:
%macro test(group=);
data X;
set
%if &group = AAA %then %do;
LIB.AAA1
LIB.AAA2
LIB.AAA3
%end;
%else %if &group = BBB %then %do;
LIB.MYDATA
LIB.BBB1
LIB.BBB2
LIB.BBB3
%end;
%else %if &group = CCC %then %do;
LIB.CCC1
LIB.CCC2
LIB.CCC3
%end;
;
%if &group = BBB %then
%let byvarlist = customer descending type key var1 var2;
%else
%let byvarlist = customer key var1 var2;
by &byvarlist.;
if first.customer then do;
<logic>
end;
run;
%mend;
Оператор BY включает новую переменную, которую я хочу, но теперь, конечно, я получаю следующую ошибку SAS для каждого набора данных в группе BBB
:
ERROR: BY variable type is not on input data set LIB.BBB1.
Добавление оператора длины hasnЭто не имеет значения для ошибки, также как и порядок списка BBB
наборов данных (то есть с MYDATA
выше BBB1
и т. д.).Другая идея, которая у меня была, заключалась в том, чтобы указать мой набор данных только в логике %if ... %then
, например %if &dataset. = LIB.MYDATA %then ...
, но я не уверен, как это сделать и будет ли он работать.
Есть ли какие-либоспособ обойти эту проблему, чтобы мой набор данных можно было сортировать дальше, не меняя вид других наборов данных?