【问题标题】:SAS conditional logic to execute another sas program based on conditionSAS条件逻辑根据条件执行另一个sas程序
【发布时间】:2016-04-10 19:06:12
【问题描述】:

我有一个名为error_table 的数据集,如下所示。所有的变量都是字符

Errorno   Error     Resolution  
001     login       check 
002     datacheck   check

如果Errorno 不在001002 中,我想要一个执行sas 程序的逻辑。否则停止执行并显示error_table

我尝试了以下

%macro test();
   proc sql;
      select trim(Error_No) into: num from error_table;
   quit;

   %if &num. not in ("001","002") %then %do;
       %include "/path/dev/program.sas";
   %end;
   %else %do;
      proc print data = error_table;
      run;
   %end;
%mend;
%test;

但是,它抛出了一个错误。

谁能更正逻辑。

【问题讨论】:

  • 它会抛出什么错误?
  • 对你的逻辑感到好奇。你的意思是:如果error_table中有任何记录其中errorno不在(“001”“002”)然后运行程序;否则打印error_table?

标签: if-statement sas sas-macro proc-sql


【解决方案1】:

您需要注意SELECT 返回零行的情况。您应该为宏变量 NUM 设置一个默认值。

您的数据集变量是数字还是字符?使用TRIMMEDSEPARATED BY 子句代替TRIM() 函数来防止INTO 子句生成的宏变量中出现空格。

%let num=NONE;
select Error_No into: num trimmed from error_table;

请记住,对于宏处理器来说,一切都是字符串,所以不要在您尝试匹配的值周围加上引号,除非它们实际上是值的一部分。

%if NOT (&num. in (001,002)) %then %do;

还要在宏代码中使用IN 运算符,您需要确保已设置MINDELIMITER 选项。

【讨论】:

  • 我想你的意思是MINOPERATOR。同样in 运算符不需要(),
【解决方案2】:

我会向proc sql 提出带有错误代码的移动条件。

proc sql;
   select count(*) into :num_errors
   from error_table
   where Errorno in ("001", "002");
quit;

然后在宏变量中,您有很多错误是 001002。 下一步是检查宏观条件:

%if &num_errors. > 0 %then %do;
   %include "/path/dev/program.sas";
%end;
%else %do;
   proc print data = error_table;
   run;
%end;
%mend;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多