欠損値に0を入れてくれる便利関数です。複数の変数がある場合は、スペースで区切ります。区切るスペースは1個でも複数個でも大丈夫です。
call Benri.NulltoZero('テーブル名', '変数1 変数2 変数3');
といった感じで使います。変数1/変数2/変数3それぞれの欠損値を0に変換します。
使い方
以下の「benri.txt」をダウンロードして、適当なところに保存してください。
サンプルプログラム
ダウンロードしたbenri.txtを c:\temp に保存して実行してみてください。
//便利関数の読み込み
$(Include=C:\temp\Benri.txt);
//テストデータ
testdata:
load prod, ym
, if(a1='', Null(), a1) as amt1
, if(a2='', Null(), a2) as amt2
Inline [
prod, ym , a1, a2
魚, 201901, 10, 10
魚, 201902, 20,
魚, 201903, , 30
魚, 201904, 40,
魚, 201905, 50, 50
魚, 201906, 60, 60
]
;
//使用例
call Benri.NulltoZero('testdata', ' amt1 amt2 ');
仕様
以下のようなサブルーチン内容です。
構造はいたってシンプルですが、引数(__vars)にスペースが複数個あった場合の処理で結構手間取ってます。
sub Benri.NulltoZero(__tbl, __vars)
//左右の無駄なスペース除去
let __vars = Trim('$(__vars)');
//スペースを1つにする
let __x = Index('$(__vars)', ' ') ;
do while __x > 0
let __x = Index('$(__vars)', ' ') ;
let __vars = Replace('$(__vars)', ' ', ' ');
loop
set __x=;
//変数の個数をスペースの個数を基に数える
let __nVar = len('$(__vars)') - len(Replace('$(__vars)', ' ', '')) + 1 ;
//処理用の各種文章
let __s1 = '';
let __s2 = '';
let __s3 = '';
let __s4 = '';
for __i=1 to $(__nVar)
let __v = SubField('$(__vars)', ' ', $(__i));
let __s1 = '$(__s1), if(IsNull($(__v)), 0, $(__v)) as __$(__v)' ; //欠損値をゼロに埋めるための文章
let __s2 = '$(__s2), $(__v)' ; //ドロップ用
let __s3 = '$(__s3), __$(__v) as $(__v)' ; //一時名から元の名前にリネーム用の文章
let __s4 = '$(__s4), __$(__v)' ; //ドロップ用
next __i
set __v=;
//最初の不要なカンマを取る
for __i=1 to 4
let __s$(__i) = mid('$(__s$(__i))', 2) ;
next __i
set __i=; set __nVar=;
//欠損ゼロ埋め
__temp: NoConcatenate
load *
, $(__s1)
Resident $(__tbl)
;
drop table $(__tbl);
//元の変数削除
drop Fields $(__s2) from __temp ;
//リネームして変数名を戻す
$(__tbl): NoConcatenate
load *
, $(__s3)
Resident __temp
;
drop table __temp ;
drop Fields $(__s4) from $(__tbl) ;
set __s1=; set __s2=; set __s3=; set __s4=;
end sub