2016-08-17 99 views
2

我有一個空的數據集,如PROC報表打印空數據集

data a; 
if 0; 
run; 

現在我希望用PROC報告打印此數據集。當然,報告中沒有任何內容,但我希望報告中的一句話說:「這是一個空數據集」。有任何想法嗎? 謝謝。

回答

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

+0

非常感謝您! – Wayne

0

對於沒有數據報告,您不需要知道數據中有多少觀察值就是沒有數據。這個例子顯示了我將如何處理這個問題。

用零obs創建示例數據。

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; 
+0

謝謝。它非常有用。 – Wayne