次の 2 つの 1 行のデータセットがあるとします。
data have_1;
input message $ order_num time price qty;
datalines;
A 3 34199 10 500
run;
data have_2;
input message $ order_num time delete_qty ;
datalines;
B 2 34200 100
run;
以前の order_numbers を集計する別のデータセットがあります。
data total;
input order_num time price qty;
datalines;
1 34197 11 550
2 34198 10.5 450
run;
私の目的は、データセットtotal
をデータセットhave_1
とhave_2
ループで更新する必要があることです。から始めるとhave_1
、 aは、データセットに新しい順序を追加するだけmessage=A
でデータセットを更新する必要があることを意味します。データセットの変更を追跡する必要があるため、データセットは次のようになります。total
total
total
total
order_num time price qty id;
1 34197 11 550 1
2 34198 10.5 450 1
3 34199 10 500 1
次に、データセットをデータセットでtotal
更新する必要があります。これは、データセットに既に存在する更新があることを意味します。の一部を削除して更新する必要があります。したがって、データセットは次のようになります。have_2
message=B
qty
order_num
total
order_num=2
qty
total
order_num time price qty id;
1 34197 11 550 2
2 34198 10.5 350 2
3 34199 10 500 2
have_
別のデータセットの各行に対応する1000 以上のデータセットがあります。total
重要なのは、すべてのメッセージの変更を追跡する必要があるということですid
。と しかないと仮定するとhave_1
、have_2
ここに私の暫定的なコードがあります:
%macro loop()
%do i=1 %to 2;
data total_temp;
set total; run;
data total_temp;
set have_&i;
if msg_type='A' then do;
set total have_&i;
drop message;
id=&i;
end;
if msg_type='B' then do;
merge total have_&i;
by order_num;
drop message;
qty=qty-delete_qty;
drop delete_qty;
id=&i
end;
run;
data total; set total_temp; run;
%end;
%mend;
%loop();
このコードは、たとえば最初のループの後、 の内容に対応する 1 行のみを保持しhave_1
ます。したがって、merge
とset
コマンドを で使用できthen do
ますか? 私が使用しなければならない適切なコードは何ですか?
最終的なデータセットは次のようになります。
order_num time price qty id;
1 34197 11 550 1
2 34198 10.5 450 1
3 34199 10 500 1
1 34197 11 550 2
2 34198 10.5 350 2
3 34199 10 500 2