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,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_2message=B这意味着数据集中已经qty存在更新。我必须通过删除一些. 因此,数据集应如下所示:order_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

我有超过 1000 个have_数据集,它们对应于另一个数据集中的每一行。重要的是我需要跟踪total每条带有id. 假设我只有have_1and 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 中使用 amergeset命令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 语句进行更新。

这可以通过两个修改语句来完成,尽管我发现通过追加添加新记录更清楚。

于 2013-09-22T22:55:59.123 回答