2013-09-22 38 views
1

說我有以下兩種一行數據集: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_1have_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_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線。因此,我們可以在then do中使用mergeset命令嗎?什麼是我必須使用的正確的代碼?

最終的數據集應該是這樣的:

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 
+0

如果您有1000個_have數據集,則您在此步驟之前做錯了某些事情。聽起來像你需要使用'by'語句,而不是分裂成多個數據集。 – Joe

+0

是@Joe我已經完成了這段代碼。 – Plug4

回答

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語句執行更新。

這可以通過兩個修改語句來完成,但我發現通過append添加新記錄會更清晰。

+0

感謝您的回覆。但我沒有選擇,我相信要通過一個宏。這是我的錯。我沒有正確解釋我的問題,並更新了上述問題。我需要一個宏的原因是因爲我有超過1000個'have_'數據集。我必須用'id'來跟蹤'total'數據集中的變化......有什麼建議嗎? – Plug4

+0

然後只需創建一個宏來遍歷上面的代碼來處理數據集。 – DomPazz

+0

ahh我很想理解你的代碼,並且你是對的,只要對你的代碼做一個宏,一切都會工作! (我想!)我將在循環中使用你的代碼,如果有什麼問題,我會讓你知道,但它應該工作!謝謝! – Plug4