1

次の 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_1have_2ループで更新する必要があることです。から始めるとhave_1、 aは、データセットに新しい順序を追加するだけmessage=Aでデータセットを更新する必要があることを意味します。データセットの変更を追跡する必要があるため、データセットは次のようになります。totaltotaltotaltotal

order_num time price qty id;
1 34197 11 550 1
2 34198 10.5 450 1
3 34199 10 500 1

次に、データセットをデータセットでtotal更新する必要があります。これは、データセットに既に存在する更新があることを意味します。の一部を削除して更新する必要があります。したがって、データセットは次のようになります。have_2message=Bqtyorder_numtotalorder_num=2qtytotal

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_1have_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ます。したがって、mergesetコマンドを で使用でき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
4

1 に答える 1

1

マクロでこれを行う必要はありません。マクロを使用できますが、遅くなります。これを試して:

data have_1;
input message $ order_num time price qty;
datalines;
A 3 34199 10 500 
run;

data have_2(index=(order_num));
input message $ order_num time delete_qty ;
datalines;
B 2 34200 100 
run;

data total(index=(order_num));
input order_num time price qty;
datalines;
1 34197 11 550
2 34198 10.5 450
run;

/*First, add new orders*/
proc append base=total data=have_1(where=(message="A")) force;
run;

/*Now update for the deletions*/
data total;
modify total have_2(where=(message="B"));
by order_num;
qty = sum(qty,-delete_qty);
drop message delete_qty;
run;

PROC APPEND を使用して、新しい順序を合計データ セットに追加します。これにより、インデックスが維持され、MODIFY ステートメントを介して更新を行うことができます。

これは 2 つの変更ステートメントを使用して行うことができますが、append を使用して新しいレコードを追加する方が明確です。

于 2013-09-22T22:55:59.123 に答える