SAS:通过查找表中的动态列合并/联接数据集
我想将sas数据集与查找表联接,但用于联接的列/键是查找表中的一个值 数据集:表4SAS:通过查找表中的动态列合并/联接数据集,sas,proc-sql,Sas,Proc Sql,我想将sas数据集与查找表联接,但用于联接的列/键是查找表中的一个值 数据集:表4 ID lev1 lev2 lev3 lev4 lev5 1 12548 14589 85652 45896 45889 2 12548 14589 85652 45896 45890 3 12548 14547 85685 45845 45825
ID lev1 lev2 lev3 lev4 lev5
1 12548 14589 85652 45896 45889
2 12548 14589 85652 45896 45890
3 12548 14547 85685 45845 45825
4 66588 24647 55255 30895 15764
查找表:
context table_name column operator value
extract table1 col1 equals xyd
asset table2 var1 equals 11111
asset table2 var2 equals 25858
prod table3 x1 equals 87999
unprod table4 lev2 equals 14589
unprod table4 lev2 equals 14589
unprod table4 lev3 equals 55255
现在我想把table4和lookup table连接起来,但这只适用于字段lev2和lev3(它是动态的,所以将来可能会更改,所以不想在其中硬编码)
我试过下面的代码,但不想硬编码,因为字段是动态的(将来可能有人还会添加lev4)
提前感谢你 下面是一个示例代码,它将获得我理解的您正在尝试执行的操作。此代码基于@Reeza的注释。如果这不是您要做的,请发送一个示例输出文件
data table4;
input ID $ lev1 $ lev2 $ lev3 $ lev4 $ lev5 $;
datalines;
1 12548 14589 85652 45896 45889
2 12548 14589 85652 45896 45890
3 12548 14547 85685 45845 45825
4 66588 24647 55255 30895 15764
;
run;
data look_up;
input context $ table_name $ column $ operator $ value $;
datalines;
extract table1 col1 equals xyd
asset table2 var1 equals 11111
asset table2 var2 equals 25858
prod table3 x1 equals 87999
unprod table4 lev2 equals 14589
unprod table4 lev2 equals 14589
unprod table4 lev3 equals 55255
;
run;
PROC transpose DATA=work.table4 out=temp1 prefix=value;
by ID;
VAR lev1-lev5;
run;
proc sql;
create table want as
select a.*, b.ID
from look_up as a
inner join temp1 as b
on a.value=b.value1 and a.column=_Name_;
quit;
这看起来不像是查找表。这似乎是一套规则。您可以使用它来生成代码。让我们通过使表包含实际代码而不是三列来简化过程。但是,您可以轻松地编写代码,将当前格式转换为代码字符串
data rules ;
infile cards truncover ;
input context $ table_name $ rule $100. ;
cards;
extract table1 col1 = xyd
asset table2 var1 = 11111
asset table2 var2 = 25858
prod table3 x1 = 87999
unprod table4 lev2 = 14589
unprod table4 lev2 = 14589
unprod table4 lev3 = 55255
;
因此,现在看起来您希望采用具有特定值CONTEXT
的规则,并使用该值从表\u NAME
中命名的数据集生成新的数据集。不确定要为生成的表使用什么名称,或者在同一“上下文”中提到多个表时要执行什么操作
这会产生如下代码:
130 +data want1 ;
131 + set table4 ;
132 + where 1=0
133 + or (lev2 = 14589 )
134 + or (lev2 = 14589 )
135 + or (lev3 = 55255 )
136 +;
137 +run;
NOTE: There were 3 observations read from the data set WORK.TABLE4.
WHERE (lev2=14589) or (lev3=55255);
NOTE: The data set WORK.WANT1 has 3 observations and 6 variables.
您可以转置第一个表以便只有一列用于联接吗?这将完全避免问题?谢谢您的回复。不幸的是,每个级别有1000个值,也有大约20个级别。上面的表格只是一个例子,用来解释我想要实现的目标。这使得转换数据的理由更加充分,不是吗。这样,无论有多少列或多少级别,解决方案都将是完全动态的……将您期望的内容作为输出,将您的数据作为数据步骤发布,我将模拟解决方案。如果您不知道如何包含数据步骤,这里有说明:这不是查找表。这是一套规则。你想用这些规则做什么?
%let context=unprod ;
filename code temp;
data _null_;
set rules ;
where context=symget('context');
by table_name ;
file code ;
if first.table_name then table_no+1;
if first.table_name then put
'data want' table_no ';'
/ ' set ' table_name ';'
/ ' where 1=0'
;
put ' or (' rule ')' ;
if last.table_name then put
';'
/ 'run;'
;
run;
%include code / source2 ;
130 +data want1 ;
131 + set table4 ;
132 + where 1=0
133 + or (lev2 = 14589 )
134 + or (lev2 = 14589 )
135 + or (lev3 = 55255 )
136 +;
137 +run;
NOTE: There were 3 observations read from the data set WORK.TABLE4.
WHERE (lev2=14589) or (lev3=55255);
NOTE: The data set WORK.WANT1 has 3 observations and 6 variables.