我正在写一个sas宏,我试图加入两个列中的一个,无论哪个存在。但是,当我给出这样的东西时,它会出错,因为它希望两列都存在:
%Macro Base_pop(ssc,input_table,POPN_TBL);
PROC SQL;
CREATE TABLE test_&ssc. AS
SELECT B.ACCOUNT_ID
FROM ADL_EXT.&input_table.TB INNER JOIN
ADL_BSE.BRDM_POP_FLG_&POPN_TBL.B
ON B.ACCOUNT_ID = (CASE WHEN %sysfunc(exist(TB.ACCOUNT_ID)) then TB.ACCOUNT_ID
ELSE TB.FAC_ID
END)
WHERE B.FLG = 'Y'
ORDER BY B.ACCOUNT_ID ;
QUIT;
%MEND;
表示TB.Account_id不存在的代码错误。我也尝试过合并,但也没用。
传递给宏的表中只存在两列中的一列。 所以,我需要动态连接当前表中存在的列。
建议请!
答案 0 :(得分:0)
您的问题描述表明您要测试变量的存在,但您没有包含任何代码来执行此操作。进行该测试的一种方法是查询有关该表的SAS元数据。因此,下面的代码将使用它在输入数据集中找到的名字ACCOUNT_ID或FAC_ID,并使用它。如果未找到,则会将错误消息写入SAS日志。
%macro base_pop(ssc,input_table,popn_tbl);
%local out ina inb var ;
%let out=test_&ssc ;
%let ina=%upcase(adl_ext.&input_table);
%let inb=%upcase(adl_bse.brdm_pop_flg_&popn_tbl);
proc sql noprint ;
select name into :var
from dictionary.columns
where libname = "%scan(&ina,1,.)"
and memname="%scan(&ina,2,.)"
and upcase(name) in ('ACCOUNT_ID','FAC_ID')
;
%if (&sqlobs) %then %do;
create table &out as
select b.account_id
from &ina a inner join &inb b
on b.account_id = a.&var
where b.flg = 'y'
order by b.account_id
;
%end;
%else %put ERROR: Could not find either ACCOUNT_ID or FAC_ID in &ina ;
quit;
%mend base_pop;