2014-12-04 3 views
0

Во-первых, у меня есть следующая таблица:SAS Proc SQL внутри% макро

data dataset; 
    input id $ value; 
    datalines; 
    A 1 
    A 2 
    A 3 
    A 4 
    B 2 
    B 3 
    B 4 
    B 5 
    C 2 
    C 4 
    C 6 
    C 8 
    ; 
run; 

Я хотел бы написать макрос, так что пользователь может подмножество данных, давая значение идентификатора. Я делаю ргос SQL внутри макроса следующим образом:

%macro sqlgrp(id=,); 

proc sql; 
     create table output_&id. as 
     select * 
     from dataset 
     where id = '&id.' 
     ; 
    quit; 
%mend; 

%sqlgrp(id=A); /*select id=A only*/ 

Я способен генерировать таблицу output_A в работе библиотеки, однако он имеет ноль (0) наблюдения.

Почему это не работает?

ответ

4

Вам нужно использовать двойные кавычки, ссылаясь на макропеременные.

Текущий код

%macro sqlgrp(id=,); 

proc sql; 
     create table output_&id. as 
     select * 
     from dataset 
     where id = '&id.' 
     ; 
    quit; 
%mend; 

%sqlgrp(id=A); /*select id=A only*/ 

выглядит для значений id, которые буквально '& идентификатор.'. Вы можете проверить это путем создания этого набора данных:

data dataset; 
    input id $ value; 
    datalines; 
&id. 2 
A 2 
    ; 
run; 

Теперь используйте %let, чтобы установить значение макропеременной id:

%let id=A; 

Выполнить быструю проверку разницы функциональности между одинарными и двойными кавычками , Обратите внимание на то, что названия содержат также одиночные и двойные кавычки, так что мы можем увидеть то, что произошло на выходе:

proc sql; 
    title 'Single Quotes - where id=&id.'; 
    select * 
    from dataset 
    where id='&id.'; 

    title "Double Quotes - where id=&id."; 
    select * 
    from dataset 
    where id="&id."; 
    title; 
quit; 

правильный код

%macro sqlgrp(id=,); 

proc sql; 
     create table output_&id. as 
     select * 
     from dataset 
     where id = "&id." 
     ; 
    quit; 
%mend; 

%sqlgrp(id=A); /*select id=A only*/ 

двойные кавычки позволяют макропеременная & идентификатор разрешите «A», который вернет результаты на основе вашего ввода.

+0

Благодаря @mjsqu. спасибо за разъяснение разницы между одинарной кавычкой и двойной цитатой. У меня есть один вопрос: есть ли разница между & id. и & id (без.) Еще раз спасибо. – useR

+1

Не совсем, в этом случае либо сделают. Период (.) Указывает SAS, где заканчивается макро-переменная, и чаще используется, когда макропеременная немедленно сопровождается чем-то другим. Попробуйте запустить следующее с и без периода (.): '% Let id = A;% put &id._x;' – mjsqu

+0

Возможно, было бы полезно добавить имена ввода и вывода в макроподпись, например,% macro sqlgrp (in =, id = out =), чтобы пользователи не переопределили вывод – Kostya

2

Просто простой переписывают предыдущий ответ, который проходит «в» и «из» через подпись макросов

%macro sqlgrp(in=, id=, out=); 
    proc sql noprint; 
     create table &out. as select * from &in. where id = "&id."; 
    quit; 
%mend sqlgrp; 
Смежные вопросы