SAS Datastep-动态创建一个表,并使用其他表中可用的列名值。
示例: 我的Source_Table看起来像 |字段编号|字段名称| | 1 | A | | 3 | B | | 2 | C |
/*Dynamic table creation*/
%let s1=;
/*Column lenght should be 30 characters so I am creating a dummy variable*/
%let Dummy= 'Dummy_Dummy_Dummy_Dummy_Dummy_Dummy_Dummy';
proc sql;
create table TEMP as
select 'Hi' as Work from Temp_table where 1=2
;
quit;
proc sort data = Source_table
by Field_No;
run;
proc sql;
select Dummy||" as "||fld into :s1 seperated by "," from
(select "&Dummy" as Dummy,substr(strip(upcase(field_name)),1,30)) as FLD
from Source_table)
;
quit;
proc sql;
create table target_table as
select "&Dummy." as value_1,&s1 from TEMP where 1=2;
quit;
目标表应为 | A | B | C |
答案 0 :(得分:0)
不清楚您要问什么;您具体提到使用SAS数据步骤,但是随后您的代码示例使用了PROC SQL-使用哪个有关系吗?另外,请注意,您的输入具有|字段编号|字段名称| 1 | A | 3 | B | 2 | C |但是然后您说输出应按A-B-C顺序排列-字段应按Field_No指定的顺序排列吗?
无论如何,这里有一些非常简单的代码可以工作:
* Create the input data set;
data source_table;
field_no = 1; field_name = 'A'; output;
field_no = 3; field_name = 'B'; output;
field_no = 2; field_name = 'C'; output;
run;
* Derive the list of field/variable names, in the correct order;
proc sql noprint;
select field_name into :var_list separated by ' '
from source_table
order by field_no
;
quit;
* Create the output data set using the variable list created above;
data target_table;
length &var_list $ 30;
run;
如果还有其他要求,意味着不允许使用这种简单方法,请更新问题以解释为什么不这样做。这段代码将所有指定的列创建为长度为30的字符变量,但可以轻松扩展以允许在source_table
中为每个变量指定类型,长度和标签-此类操作已全部完成我的工作时间。
答案 1 :(得分:0)
谢谢克里斯。
我尝试了类似的方法,并且有效
proc sql noprint;
select catt(Field_name, ' char(30)') into :Col_name separated by ', '
from Source_table
order by field_no;
create table Target_table
(Value_1 char(30), &Col_name);
quit;