我需要从一个表中查找数据,并根据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中有更多的障碍,但我希望这能更好地说明问题。
答案 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;