2015-10-09 61 views
0

我的编程经验非常有限,所以如果可能的话,需要相当基本的回答。 我有我的第一个表的呼叫细节,然后第二个表的地址在呼叫ID匹配 我的问题是当第一个表返回零结果(这将发生更多的时候比没有)第二个表错误,因为没有数据在第一张桌子。 所以我想在第一个表执行后,如果有零结果,然后停止/退出,如果有结果,然后继续。我已经看过这个了,但是我发现的所有解决方案都非常技术性,而且我不会停下来理解所有建议的,因此我一直无法实现。所以我已经说过,我真的需要一个非常简单和易于理解的解释,这个解释对于具有非常基本的编程知识的人或者有什么可以解决这个问题的建议有帮助。谢谢SAS当obs为零时退出,然后退出其他继续

+0

一般而言,步骤不会因操作返回0个观察值而停止。如何做到这一点取决于你在做什么步骤。发布您正在执行的步骤类型的示例,以便我们可以针对该情况发布答案。 – Tom

回答

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。使用stop是因为在执行set-statement之前计算nobs,所以我在它之前停止datastep。根据varnobs中的数字,你可以像你想要的那样行事,比如关闭中止或者结束进程,执行特定代码等等......

我必须承认,使用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; 

或者是把整个代码到宏...

我希望这个代码是你有足够的基础,在那一刻我想不出不使用宏变量的解决方案...

+0

嗨感谢您的回复。我已经尝试将以上代码添加到我的代码中,但是我有一些错误。 %macro check_data(table = qldreps); data_null_;调用symput('varnobs',n_obs); stop; set&qldreps nobs = n_obs;跑; %如果&varnobs = 0%,则%do; ENDSAS; %结束;%修正check_data; %check_data(“qldreps”); PROC SQL; CREATE TABLE qldreps AS SELECT c.incident_number, c.incident_type FROM 1 AS c,2 as a c.zone = a.zone QUIT; proc sql; CREATE TABLE detail AS SELECT a.incident_number FROM 1 as a,3 as b WHERE a.incident_number = b.incident_number; QUIT; – Malibu2012

+0

@ malibu2012 hm,我看到的一个错误是'set&qldreps'。你必须使用'set&table',table是你在这里引用的变量,qldreps只是一个表名。如果表名总是相同的,你可以在宏定义和调用中删除(table = qldreps),并在宏内写入'set qldreps'。但是由于注释中的格式化,在这里很难分析你的代码。你的宏调用'%check_data(“qldreps”); '必须在创建表之后,所以将它放在proc sql – kl78

+0

最适合测试的位置,只需将我的代码复制到它的答案中,然后在%m​​end check_data之间插入用于表创建的proc sql;和 %check_data(“qldreps”); – kl78

0

感谢kl78

我抄你提供的是和现在的代码我得到一个错误说:“更多的位置参数中所定义的”

我有我的代码如下

%宏check_data(表= qldreps);

data null;

call symput('varnobs',n_obs); 

stop; 

set &table nobs=n_obs; 

run;

%if & varnobs = 0%then%do;

ENDSAS; 

%end;

%修复check_data;

proc sql;

创建表qldreps作为

选择c.incident_num,

c.incident_type 

从CAD。incindet as c

其中c.incident_type = 601;

quit;

%check_data(“qldreps”);

proc sql;

创建表详细地

选择b.details

从qldreps为a,

cad.incident_detail as b 

其中a.incident_number = b.incident_number;

quit;

我没有得到什么?谢谢

+0

如果将一个参数定义为named(带有等号),则不能转身称呼它,就好像将其定义为位置一样。最简单的改变是在宏调用中添加参数名称。 '%check_data(表= qldreps)'。也不要在参数值周围加引号。在这种情况下,它会导致SAS在当前目录中查找名为“qldreps.sas7bdat”的文件,而不是使用数据集work.qldreps。 – Tom

相关问题