SAS:合并到一个DO命令(SAS: merge in a do command)

2019-09-26 03:26发布

说我有以下两种一行数据集:

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 ,一个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意味着有一个更新的qtyorder_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_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();

此代码,表示第一个循环后,只保留一个对应于什么在行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

Answer 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语句来完成更新。

这可以通过两个修改语句来完成,但我觉得通过追加添加新记录更清晰。



文章来源: SAS: merge in a do command
标签: merge set sas