繁体   English   中英

%macro中的SAS proc sql

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM