Sas 在一个表中查找值并根据IF条件(合并/SQL)添加到数据集?

Sas 在一个表中查找值并根据IF条件(合并/SQL)添加到数据集?,sas,Sas,我需要从一个表中查找数据,并根据if条件将其添加到主数据表中:数据是否标记为缺失。假设查找表包含国家和端口。主文件中缺少需要填写的端口名。仅当flag=1(缺少)时,它才使用查找填充这些内容 此命令不起作用(将不填充它&将不保留标志为0的obs): 下面是一个有一些数据的例子 查找表(3个变量): 大师(许多Var): 因此,它需要根据LPortMiss=1以及LoadCountry和LoadArea相等的事实,使用查找中的第一个obs(ARZEW)填充MASTER中的第一个obs。LOOKUP

我需要从一个表中查找数据,并根据if条件将其添加到主数据表中:数据是否标记为缺失。假设查找表包含国家和端口。主文件中缺少需要填写的端口名。仅当flag=1(缺少)时,它才使用查找填充这些内容

此命令不起作用(将不填充它&将不保留标志为0的obs):

下面是一个有一些数据的例子

查找表(3个变量):

大师(许多Var):


因此,它需要根据LPortMiss=1以及LoadCountry和LoadArea相等的事实,使用查找中的第一个obs(ARZEW)填充MASTER中的第一个obs。LOOKUP和MASTER中还有很多OB,但我希望这能更好地说明问题。

我想这就是您要寻找的:

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;
coalesce
函数返回第一个非缺失的参数,因此如果
loadport
在表
master
中缺失,则从表
lookup
中获取


顺便说一下,这不是SAS特有的。对于此类问题,您可以使用
SQL
标签。

您还可以使用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;

你能用一些数据举个例子吗?此外,你应该回到你的另一个问题,并“接受”对你有用的答案,正如其中一条评论中所建议的那样。这会激励人们回答您的问题。谢谢,这很有效,不过为了保留整个数据集,我将其修改为:proc sql;从a.loadcountry=b.loadcountry和a.loadarea=b.loadarea上的主控a左连接查找b中选择合并(a.loadport,b.loadport),*;退出好的选择!非常感谢你们两位的回答。
OBS    LoadPort  LoadCountry LoadArea  LPortMiss
1                 ALGERIA    NAF        1
2      ADELAIDE  AUSTRALIA   SEOZ       0
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;
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;