假设我有以下两个单行数据集:
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
,amessage=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
and 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
. 因此,我们可以在 a 中使用 amerge
和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