说我有以下两种一行数据集:
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
,一个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
我有超过1000点have_
相当于每行中的另一个数据集的数据集。 最重要的是,我需要跟踪的变化, 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();
此代码,表示第一个循环后,只保留一个对应于什么在行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