当obs为零时,SAS则退出,否则继续

时间:2015-10-09 10:32:26

标签: sql sas

我的编程经验非常有限,如果可能的话,需要一个相当基本的答案。 我的第一个表有呼叫详细信息,第二个表有呼叫ID匹配的地址 我的问题是第一个表返回零结果(这将经常发生)第二个表错误,因为第一个表中没有数据。 所以我想在第一个表执行后如果没有结果然后停止/退出,如果有结果然后继续。我已经看了这个,但我找到的所有解决方案都是技术性的,我不会放弃了解我为此无法实现的所有建议。所以我已经说过,我真的需要一个非常简单易懂的解释 具有非常基本的编程知识或建议的人,可以采取哪些措施来解决这个问题。谢谢

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题并用一个简单的宏修复了这个问题:

%macro check_data(table=);

data _null_;
    call symput('varnobs',n_obs);
    stop;
    set &table nobs=n_obs;
run;

%if &varnobs = 0 %then %do;
    ENDSAS; 
%end;

%mend check_data;
%check_data("table1");

简短的解释,你给宏的表名,它计算obervations并将它们写入macrovariable varnobs。使用停止是因为在执行set语句之前计算nobs,所以我在它之前停止datastep。根据varnobs中的数字,您可以按照您的意愿行事,例如使用abort或endsas关闭进程,执行特定代码等...

我必须承认,使用ENDSAS是可讨论的命令,因为它会关闭所有内容,更好的解决方案是使用逻辑方法,例如

%if &varnobs ne 0 %then %do;
 data table2;
 *do your second dataset operation inside the macro only when varnobs is not 0...;
 run;
%end;

或将您的整个代码放入宏...

我希望这段代码对您来说已经足够基础了,目前我无法在不使用宏变量的情况下考虑解决方案......

答案 1 :(得分:0)

谢谢kl78

我已经复制了您提供的代码,现在我收到错误说"更多的位置参数找到了定义的"

我的代码如下

%macro check_data(table = qldreps);

数据 null ;

call symput('varnobs',n_obs);

stop;

set &table nobs=n_obs;

运行;

%if& varnobs = 0%然后%do;

ENDSAS;

%端;

%mend check_data;

proc sql;

将表qldreps创建为

选择c.incident_num,

   c.incident_type
来自cad.incindet的

作为c

其中c.incident_type = 601;

退出;

%check_data(" qldreps&#34);

proc sql;

将表格详细信息创建为

选择b.details

来自qldreps作为,

cad.incident_detail as b

其中a.incident_number = b.incident_number;

退出;

我没有得到什么?谢谢