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

时间:2012-02-01 14:31:39

标签: sas

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

此命令不起作用(不会将其填入&不会保留带有Flag = 0的obs):

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;

这是一个带有一些数据的例子......

LOOKUP表(3个vars):

LoadPort LoadCountry  LoadArea
ARZEW    ALGERIA      NAF

MASTER(很多变种):

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

因此,基于LPortMiss = 1且LoadCountry和LoadArea相等的事实,它需要用LOOKUP(ARZEW)中的第一个obs填充MASTER中的第一个obs。 LOOKUP和MASTER中有更多的障碍,但我希望这能更好地说明问题。

2 个答案:

答案 0 :(得分: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;

coalesce函数返回第一个非缺失参数,因此如果表loadport中缺少master,那么它将从表lookup中获取。

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

答案 1 :(得分: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;