SQLのCOUNT関数は、クエリ結果の件数を返します。
非常に便利で手軽に使える関数ですが、若干注意が必要です。
まず、以下のようなプログラムを実行してみます。
data temp ;
do i=1 to 10 ;
output ;
end ;
run ;
proc sql noprint ;
select count(i) into: cnt
from temp
;
quit ;
%put cnt ***** &cnt ***** ;
結果は下記のとおりです。

なんのことはないですね。10が返ってきています。
では、次のプログラムを実行するとどうでしょうか?
data temp ;
do i=1 to 10 ;
if mod(i,2) then j=i ;
else j=. ;
output ;
end ;
run ;
proc sql noprint ;
select count(j) into: cnt
from temp
;
quit ;
%put cnt ***** &cnt ***** ;
MOD関数を使って、変数iが奇数のときは変数jに変数iの値を、
変数iが偶数のときは変数jに欠損値を格納した場合の、変数jの件数を求めるクエリです。
結果は下記のとおりです。

10ではなく5が返ってきました。
この結果を見れば分かると思いますが、
COUNT関数は、指定した引数が欠損値の場合は件数をカウントしません。
もちろん、有効な値が入っている件数を求める目的であれば問題ありませんが、
有効な値・欠損値を問わずに件数を求める場合には期待する結果が得られません。
欠損値を含んでいるか否かが分からない場合は、
下記のように条件を加えてあげるといいでしょう。
proc sql noprint ;
select count(case j when . then 0 else 1 end) into: cnt
from temp
;
quit ;
%put cnt ***** &cnt ***** ;

[google]
0 件のコメント:
コメントを投稿