2012-02-01 44 views
2

我需要從一個表中查找數據,並根據if條件將它添加到主數據表中:數據是否標記爲缺失。假設查找表包含國家和端口。主文件中缺少需要填寫的端口名稱。只有當flag = 1(它缺失)時,它纔會使用查找來填充它們。根據IF條件(MERGE/SQL)在一個表中查找值並添加到數據集?

此命令不起作用(不會填滿它&不會保持OBS與標誌= 0):

proc sql; 
create table data.varswprice1 as 
select * 
from data.varswprice a left join data.LPortsFill b 
on a.LoadCountry = b.LoadCountry and a.LoadArea = b.LoadArea 
where LPortMiss = 1; 
quit; 

這裏有位數據的例子...

查找表(3個VARS):

LoadPort LoadCountry LoadArea 
ARZEW ALGERIA  NAF 

MASTER(許多VARS):

OBS LoadPort LoadCountry LoadArea LPortMiss 
1     ALGERIA NAF  1 
2  ADELAIDE AUSTRALIA SEOZ  0 

因此,它需要在LOOKUP(ARZEW)中根據LPortMiss = 1和LoadCountry和LoadArea相等的事實填寫MASTER中的第一個obs。在LOOKUP和MASTER中還有更多的obs,但我希望能更好地說明問題。

+0

你可以舉一些數據的例子嗎?此外,您應該回到您的其他問題,並「接受」適合您的答案,正如其中一條評論中所建議的那樣。這給了人們一個回答你問題的動機。 – itzy 2012-02-01 14:43:30

回答

1

您還可以在proc sql中使用UPDATE函數,這樣可以節省創建新數據集的空間。您可能也想要重置lportmiss標誌。

proc sql; 
update master as a 
    set loadport=(select loadport from lookup as b 
     where a.LoadCountry=b.LoadCountry and a.LoadArea=b.LoadArea) 
where lportmiss=1; 
quit; 
+0

不錯的選擇!非常感謝你的迴應。 – Sassafras 2012-02-02 16:24:08

2

我認爲這是你在找什麼:

proc sql; 
    select coalesce(a.loadport,b.loadport), a.loadcountry, a.loadarea 
    from master a left join lookup b 
    on a.loadcountry=b.loadcountry and a.loadarea=b.loadarea; 
quit; 

的​​3210函數返回第一個非缺失參數,因此,如果loadport從表master那麼它需要從表lookup失蹤。

順便說一句,這不是特定於SAS。對於這樣的問題,您可以使用SQL標籤。

+0

謝謝,這工作,雖然保留整個數據集我修改它爲:proc sql; 選擇合併(a.loadport,b.loadport),* 來自主要左連接查找b​​ 上a.loadcountry = b.loadcountry和a.loadarea = b.loadarea; quit; – Sassafras 2012-02-02 16:22:03

相關問題