Как я могу присвоить значение макропеременной из таблицы и добавить данные вывода макроса в SAS - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть таблица с 10 значениями, которые будут использоваться в качестве входных данных в макросе.Ниже приведены структура и имя таблицы

Table b
Column 1 Column 2
P_0          10
P_10         34
P_20         55
P_30         67

Мне нужно повторно запустить следующий код с указанными выше значениями и добавить данные

proc sql;
create table a1 as
select * from table a
where amount>=p_0;

proc sql;
create table a2 as
select * from table a
where amount>=p_10;
......

Как определить макропеременную и записатьмакрос для того же в SAS

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Предложение SQL INTO назначит значения переменных набора данных значениям макропеременных.

data have;
  do acctid = 1 to 10;
    do _n_ = 1 to 200;
      txid + 1;
      amount = floor(100*ranuni(123))-25;
      array v(10) (1:10);
      output;
    end;
  end;
run;

data params; input name $ value;datalines;
P_0          10
P_10         34
P_20         55
P_30         67
run;

%macro foo;

  proc sql noprint;
    select name, value into :name1-, :value1-
    from params;

  %local N i;
  %let N = &SQLOBS;

  data
    %do i = 1 %to &N;

    want&i

    %end;
  ;

    set have;

    * complicated stuff involving v1-v10;

    %do i = 1 %to &N;

    if amount >= &&value&i then do;
      splitfor = "&&name&i";
      OUTPUT want&i;
    end;

    %end;

  run;

%mend;

options mprint;

%foo;

Из-за использования макроса для генерации исходного кода этот метод не следует использовать, когда требуется высокоточное сравнение.

0 голосов
/ 08 февраля 2019

Вам не нужен макрос - используйте вызов execute:

data _null_;
  set b;
  if _n_=1 then call execute('proc sql;');
  str1=cats('create table a',_n_);
  retain str2 ' as select * from table a where amount>=';
  call execute(str1!!str2!!'column 1'n!!";');
run;

, это сгенерирует нижеприведенное в стеке вызовов и выполнит лот после шага данных:

proc sql;
create table a1 as select * from table a where amount>= P_0;
create table a2 as select * from table a where amount>= P_10;
create table a3 as select * from table a where amount>= P_20;
create table a4 as select * from table a where amount>= P_30;
...