SAS proc sql里面的%宏

时间:2014-12-04 07:39:27

标签: sql sas sas-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值来对数据进行子集化。我按如下方式在宏内部执行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)个观察值。

为什么这不起作用?

2 个答案:

答案 0 :(得分:5)

引用宏变量时需要使用双引号。

当前代码

%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*/

查找{em>字面'& 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'”,它将根据您的输入返回结果。

答案 1 :(得分:3)

只需简单地重写上一个通过宏的签名传入'in'和'out'的答案

%macro sqlgrp(in=, id=, out=);
   proc sql noprint;
      create table &out. as select * from &in. where id = "&id.";
   quit;
%mend sqlgrp;