proc报告打印空数据集

时间:2016-08-17 22:05:20

标签: sas report

我有一个空数据集,例如

data a;
if 0;
run;

现在我希望使用proc报告来打印此数据集。当然,报告中没有任何内容,但我希望报告中的一句话说“它是一个空数据集”。有任何想法吗? 感谢。

2 个答案:

答案 0 :(得分:3)

您可以先测试数据集中是否有任何观察结果。如果有观察结果,则使用数据集,否则使用看起来像这样的虚拟数据集并打印出来:

data use_this_if_no_obs;
  msg = 'It is a null dataset';
run;

有很多方法可以测试数据集,看它们是否包含任何观察结果。我个人最喜欢的是这里找到的%nobs宏:https://stackoverflow.com/a/5665758/214994(除了我的答案,还有几种可供选择的方法,或者进行谷歌搜索)。

使用此%nobs宏,我们可以确定要在一行代码中使用的数据集:

%let ds = %sysfunc(ifc(%nobs(iDs=sashelp.class) eq 0, use_this_if_no_obs, sashelp.class));

proc print data=&ds;
run;

这里有一些代码显示了替代结果:

data for_testing_only;
  if 0;
run;

%let ds = %sysfunc(ifc(%nobs(iDs=for_testing_only) eq 0, use_this_if_no_obs, sashelp.class));

proc print data=&ds;
run;

我已使用proc print来简化示例,但您可以根据需要调整它以使用proc report

答案 1 :(得分:0)

对于无数据报告,您不需要知道数据中有多少观察结果,只有没有。这个例子说明了我将如何处理这个问题。

创建零障碍的示例数据。

data class;
   stop;
   set sashelp.class;
   run;

检查没有障碍物并在所有变量上添加一个缺失的障碍物。请注意,在此步骤中,每次从类中读取都没有观察到。

data class;
   if eof then output;
   stop;
   modify class end=eof;
   run;

制作报告

proc report data=class missing;
   column _all_;
   define _all_ / display;
   define name / order;
   compute before name;
      retain_name=name;
      endcomp;
   compute after;
      if not missing(retain_name) then l=0;
      else l=40;
      msg = 'No data for this report';
      line msg $varying. l;
      endcomp;
   run;