Merge SAS:在do命令中合并

Merge SAS:在do命令中合并,merge,set,sas,Merge,Set,Sas,假设我有以下两个单行数据集: 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; 我有另一个数据集,它汇总了以前的订单号 data total; input order_num time pri

假设我有以下两个单行数据集:

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;
我有另一个数据集,它汇总了以前的订单号

data total;
input order_num time price qty;
datalines;
1 34197 11 550
2 34198 10.5 450
run;
我的目标是使用循环中的数据集
have_1
have_2
更新数据集
total
。当我从
have_1
开始时,一条
消息=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
order_num time price qty id;
1 34197 11 550 2
2 34198 10.5 350 2
3 34199 10 500 2
   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
然后,数据集
total
需要使用数据集
have_2
进行更新,其中
message=B
意味着将
qty
更新为
total
数据集中已经存在的
order_num
。我必须通过删除一些
数量
来更新
订单_num=2
。因此,
total
数据集应如下所示:

order_num time price qty id;
1 34197 11 550 1
2 34198 10.5 450 1
3 34199 10 500 1
order_num time price qty id;
1 34197 11 550 2
2 34198 10.5 350 2
3 34199 10 500 2
   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
我有1000多个
have_
数据集,它们对应于另一个数据集中的每一行。 重要的是,我需要跟踪每个id为
id
的邮件的
total
的变化。假设我只有
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
中的内容。因此,我们可以在
中使用
合并
设置
命令,然后执行
?我必须使用的正确代码是什么

最终数据集应如下所示:

order_num time price qty id;
1 34197 11 550 1
2 34198 10.5 450 1
3 34199 10 500 1
order_num time price qty id;
1 34197 11 550 2
2 34198 10.5 350 2
3 34199 10 500 2
   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

您不需要在宏中执行此操作。您可以使用宏,但速度较慢。试试这个:

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语句进行更新


这可以通过两个modify语句来完成,不过我发现通过append添加新记录更为清晰。

您不需要在宏中执行此操作。您可以使用宏,但速度较慢。试试这个:

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语句进行更新


这可以通过两个modify语句来完成,不过我发现通过append添加新记录更清晰。

谢谢您的回复。但我别无选择,我相信我会经历一个宏观过程,这是我的错。我没有正确解释我的问题,我更新了上面的问题。我需要宏的原因是因为我有1000多个
have\uucode>数据集。我必须用
id
跟踪
total
数据集的变化。。。有什么建议吗?那就创建宏来循环你的数据集的上面的代码。啊,我想我一开始就理解了你的代码,是的,你是对的,只要在你的代码上做一个宏,一切都会工作的!(我想!)我会在一个循环中使用你的代码,如果有什么错误,我会让你知道,但它应该会解决!谢谢np@乔说得对。将所有数据集放在一起是最佳实践。我这里的代码的优点是,它可以处理输入数据集中的1个或任意数量的观察值。如果您首先将1000多个集合合并为2个集合(附加和更新),您可能会发现运行时间更快。谢谢您的回复。但我别无选择,我相信我会经历一个宏观过程,这是我的错。我没有正确解释我的问题,我更新了上面的问题。我需要宏的原因是因为我有1000多个
have\uucode>数据集。我必须用
id
跟踪
total
数据集的变化。。。有什么建议吗?那就创建宏来循环你的数据集的上面的代码。啊,我想我一开始就理解了你的代码,是的,你是对的,只要在你的代码上做一个宏,一切都会工作的!(我想!)我会在一个循环中使用你的代码,如果有什么错误,我会让你知道,但它应该会解决!谢谢np@乔说得对。将所有数据集放在一起是最佳实践。我这里的代码的优点是,它可以处理输入数据集中的1个或任意数量的观察值。如果您首先将1000多个集合合并为2个集合(附加和更新),您可能会发现运行时间更快。如果您有1000多个数据集,那么您在这一步之前就做错了。听起来你需要使用
by
语句,而不是拆分成多个数据集。是的@Joe我已经完成了这段代码。如果你有1000个数据集,那么你在这一步之前就做错了。听起来您需要使用
by
语句,而不是拆分成多个数据集。是的@Joe我已经完成了这段代码。