說我有以下兩種一行數據集:SAS:合併到一個DO命令
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;
我的目標是,我需要在一個循環的數據集have_1
和have_2
更新數據集total
。當我從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
到已經在total
數據集中的order_num
。我必須通過刪除一些qty
來更新order_num=2
。因此,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
線。因此,我們可以在then do
中使用merge
和set
命令嗎?什麼是我必須使用的正確的代碼?
最終的數據集應該是這樣的:
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數據集,則您在此步驟之前做錯了某些事情。聽起來像你需要使用'by'語句,而不是分裂成多個數據集。 – Joe
是@Joe我已經完成了這段代碼。 – Plug4