SAS PROC SQL连接同列名数据集时自动区分同名字段的方法问询
解决方案
首先明确你遇到问题的根本原因:SAS PROC SQL的默认列名生成规则,本身不会因为你在select子句里写了表别名(比如a.fish、b.fish),就自动把表来源附加到最终输出的列名上。只要两个字段的原始名称完全一致,输出时就会被自动去重为同一个列名,这也是你当前代码运行后只返回一个fish列的核心原因。
你完全不需要手动给50个字段逐个编写AS别名,通过SAS自带的字典表、宏变量批量生成select语句的方式,就可以自动按字段所属的表给列设置标签,两类适配不同场景的实现方法如下:
用字典表自动匹配公共字段,零手动编写select代码
这个方法适合你需要选取两个表所有同名字段做对比的场景,连字段清单都不需要手动整理:
proc sql noprint; /* 自动匹配两个数据集的所有公共字段,生成带表前缀的select表达式 */ select catt('a.', a.name, ' as a_', a.name), catt('b.', b.name, ' as b_', b.name) into :a_select_list separated by ', ', :b_select_list separated by ', ' from dictionary.columns as a inner join dictionary.columns as b on upcase(a.name) = upcase(b.name) where /* 替换为你的实际逻辑库和表名,默认WORK库的话libname就是WORK */ upcase(a.libname) = 'WORK' and upcase(a.memname) = 'NEWMONTH' and upcase(b.libname) = 'WORK' and upcase(b.memname) = 'PREVIOUSMONTH' /* 排除关联键这类不需要重复选取的字段 */ and upcase(a.name) ne 'POND' ; quit;
跑完上述代码后,你原有的PROC SQL只需替换为引用自动生成的宏变量即可,完全不需要手写字段名和AS别名:
proc sql; create table diff as select a.pond, &a_select_list., &b_select_list. from newmonth as a left join previousmonth as b on a.pond = b.pond; quit;
最终输出的列会自动按照所属表生成a_fish、b_fish这类带来源标记的列名,完全符合你的需求。
针对“仅选取指定50个动物字段”场景的简化实现
如果你不需要提取两个表的所有公共字段,只需要选取你指定的50个动物对应字段,那也只需要把字段名列一次清单,不需要重复编写两遍带AS的表达式:
- 第一步:整理目标字段清单,所有要选的动物字段只需要列一次:
data target_vars; length var_name $30; input var_name $; cards; fish cat /* 剩下48个你需要选取的动物字段直接列在此处即可 */ ; run; - 第二步:批量自动拼接两个表的带别名select列表:
data _null_; set target_vars end=last; retain a_list b_list ''; length a_list b_list $20000; /* 自动为a表字段生成a.原字段 as a_原字段的表达式 */ a_list = catx(', ', a_list, catt('a.', var_name, ' as a_', var_name)); /* 自动为b表字段生成b.原字段 as b_原字段的表达式 */ b_list = catx(', ', b_list, catt('b.', var_name, ' as b_', var_name)); if last then do; call symputx('final_a_select', a_list); call symputx('final_b_select', b_list); end; run;
后续PROC SQL直接引用自动生成的宏变量即可,整体工作量不到手动编写AS的10%。
注意:*截至当前所有SAS正式版本(包括Viya云原生版本),PROC SQL都没有内置“自动为跨表同名列添加表来源前缀作为列名”的参数开关,所有自动区分列名的场景,本质都是通过上述批量生成别名的逻辑实现,没有更轻量化的一键设置选项。
内容的提问来源于stack exchange,提问作者mexicanseafood
相关产品推荐
相关产品推荐

