SAS proc sql里面的%宏

use*_*seR 1 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;
Run Code Online (Sandbox Code Playgroud)

我想编写一个宏,以便用户可以通过给出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*/
Run Code Online (Sandbox Code Playgroud)

我能够在WORK库中生成output_A表,但是它有零(0)个观察值.

为什么这不起作用?

mjs*_*squ 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*/
Run Code Online (Sandbox Code Playgroud)

查找的值id字面上的 "&ID.".您可以通过创建此数据集来测试它:

data dataset;
    input id $ value;
    datalines;
&id. 2
A    2
    ;
run;
Run Code Online (Sandbox Code Playgroud)

现在,用于%let设置宏变量的值id:

%let id=A;
Run Code Online (Sandbox Code Playgroud)

快速测试单引号和双引号之间的功能差异.请注意,标题还包含单引号和双引号,因此我们可以准确地看到输出中发生了什么:

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;
Run Code Online (Sandbox Code Playgroud)

正确的代码

%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*/
Run Code Online (Sandbox Code Playgroud)

双引号允许宏变量&id解析为'A',它将根据您的输入返回结果.