创建具有其他表中可用的列名值的表

时间:2019-02-05 06:10:35

标签: sas-macro datastep

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 |

2 个答案:

答案 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;