2017-04-04 12 views
2

ゼロ行を生成するクエリを実行する場合、欠損値が割り当てられたすべての列を持つ1行で作成されたSASデータセットが必要です。Proc欠損値のSQL割り当て

私は独立したデータステップを使用してこれを行う方法を見つけました:

%let dsid = %sysfunc (open(myfile)); 
%let anyobs = %sysfunc (attrn(&dsid,ANY)); 
%let dsid = %sysfunc (close(&dsid)); 
data _null_; 
    if &anyobs=0 then do; 
    call execute('data work.myfile; call missing(col1, col2, col3); run;'); 
end; 

これは正常に動作しますが、私はのproc SQL内の各列のために行方不明を割り当てる場合がある方法を不思議でしたか?

おかげ ダン

答えて

3

それでは、あなたがこれを実行するとしましょう:

ちょうどこれを行うことができます次に
proc sql; 
    create table class as 
    select * from sashelp.class 
    where age=19; 
quit; 

出力は、前の前の行を取得するために設定されている
%macro ifMissingRow(data=); 
    %let dsid = %sysfunc (open(&data.)); 
    %let anyobs = %sysfunc (attrn(&dsid,ANY)); 
    %let dsid = %sysfunc (close(&dsid)); 
    %if &anyobs=0 %then %do; 
    data &data.; 
     output; 
     set &data.; 
    run; 
    %end; 
%mend ifmissingRow; 

%ifMissingRow(data=class); 

SETは、データ行を0行で停止します(ポインタはh/t Tom)。

+0

優れたソリューション。ありがとうございました! – 99Valk

+1

あなたがすでに観測値がないことが分かっているなら、IF 0のトリックは必要ありません。SETステートメントの前にOUTPUTステートメントを移動するだけで、1つの観察が得られます。 – Tom

+0

はい、良い点は確かです... – Joe

3

SETステートメントのNOBS=オプションを使用すると、データセットに少なくとも1つの観察があることを確認する簡単な方法があります。

data want ; 
    if 0=_nobs then output; 
    set want nobs=_nobs; 
run; 

注データセットが大きく、あなたが、あなたは条件付きでデータのステップを生成するために、いくつかの方法を使用する可能性があるデータを再書き込みする必要がありますする必要はなかった場合。たとえば、自動マクロ変数SQLOBSをテストし、0の場合はデータステップを生成します。この場合、既にあなたがしているので、nobをテストする必要はありません。また、データセット名をハードコードする代わりに、自動マクロ変数SYSLASTを使用することもできます。これにCALL EXECUTEを使うこともできますが、関数IFC()を使うこともできます。すべてのおそらく最高の

%sysfunc(dequote(
%sysfunc(ifc(0=&sqlobs,'data &syslast;output;set &syslast;run;','')) 
)) 

MODIFYステートメントを使用し、条件付きでOUTPUTステートメントを実行します。SQLOBSマクロ変数をテストできます。

data &syslast ; 
    if &sqlobs=0 then output; 
    modify &syslast ; 
    stop; 
run; 

またはNOBS=オプションでMODIFYステートメントを使用できます。

data &syslast ; 
    if 0=_nobs then output; 
    modify &syslast nobs=_nobs; 
    stop; 
run; 

すべてのSQLソリューション

あなたは変数名の少なくとも一つ、あなたが使用することができますを知っているし、SQL INSERT文場合。

insert into &syslast (varname) values (null); 

したがって、データセット名、観測数、および変数名を入力として使用する単純なマクロを作成することがあります。

%macro ifzeronull(dsn,nobs,avar); 
%if &nobs=0 %then %do; 
    insert into &dsn (&avar) values (null); 
%end; 
%mend ; 

次に、同じPROC SQLコールに留まり、条件付きで観測を追加することができます。

proc sql; 
    create table want as 
    select * from sashelp.class 
    where age=19 
    ; 
    %ifzeronull(&syslast,&sqlobs,name) 
quit; 
+0

オプションの素晴らしい調査! – Joe