SAS:在查找中按动态列合并/连接数据集 table
SAS: merge/ join datasets by dynamic columns in the look up table
我想通过查找 table 加入 sas 数据集,但是用于加入的 column/key 是查找中的一个值 table
数据集:table4
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
查找table:
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 查找 table 但它只能用于字段 lev2 和 lev3(它是动态的,所以将来可能会改变,所以不想在其中硬编码)。
我试过下面的代码,但不想硬编码,因为字段是动态的(将来有人可能会添加 lev4)。
proc sql ;
create table want as
select ID
from table4 as a
inner join lookup as b
on a.lev2 = input(value,12.) or a.lev3=input(value,12.)
where Context="unprod";
quit;
提前致谢。
这是一个示例代码,可以得到我所理解的您正在尝试执行的操作。此代码基于@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;
这看起来不像是查找 table。这似乎是一套规则。您可以使用它来生成代码。让我们通过使 table 包含实际代码而不是三列来简化该过程。但是您可以轻松编写代码以将当前格式转换为代码字符串。
data rules ;
infile cards truncover ;
input context $ table_name $ rule 0. ;
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
的规则,并使用它从 TABLE_NAME
中命名的数据集生成新数据集。不确定要为生成的 table 使用什么名称,或者在同一个 "context".
中提到多个 table 时要做什么
%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.
我想通过查找 table 加入 sas 数据集,但是用于加入的 column/key 是查找中的一个值 table
数据集:table4
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
查找table:
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 查找 table 但它只能用于字段 lev2 和 lev3(它是动态的,所以将来可能会改变,所以不想在其中硬编码)。
我试过下面的代码,但不想硬编码,因为字段是动态的(将来有人可能会添加 lev4)。
proc sql ;
create table want as
select ID
from table4 as a
inner join lookup as b
on a.lev2 = input(value,12.) or a.lev3=input(value,12.)
where Context="unprod";
quit;
提前致谢。
这是一个示例代码,可以得到我所理解的您正在尝试执行的操作。此代码基于@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;
这看起来不像是查找 table。这似乎是一套规则。您可以使用它来生成代码。让我们通过使 table 包含实际代码而不是三列来简化该过程。但是您可以轻松编写代码以将当前格式转换为代码字符串。
data rules ;
infile cards truncover ;
input context $ table_name $ rule 0. ;
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
的规则,并使用它从 TABLE_NAME
中命名的数据集生成新数据集。不确定要为生成的 table 使用什么名称,或者在同一个 "context".
%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.