[英]SAS proc sql inside %macro
首先,我有下表:
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;
我想编写一个宏,以便用户可以通过提供id值来子集数据。 我在宏中执行proc 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*/
我能够在WORK库中生成output_A表,但是它具有零(0)个观察值。
为什么这不起作用?
引用宏变量时,需要使用双引号。
当前代码
%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”的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*/
双引号允许宏变量&id解析为'A',这将根据您的输入返回结果。
只需简单地重写以前的答案,即可通过宏的签名传递“输入”和“输出”
%macro sqlgrp(in=, id=, out=);
proc sql noprint;
create table &out. as select * from &in. where id = "&id.";
quit;
%mend sqlgrp;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.