2012-02-01 46 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

相关问题