1

我来晚了一个项目,想编写一个宏来规范化一些数据以导出到 SQL Server。

有两个控制表...
- 表 1(customers)包含客户唯一标识符列表
- 表 2(hierarchy)包含表名称列表

然后n还有其他表格。(hierarchy) (在 SourceTableName 字段中命名)中的每条记录一个。形式为...
- CustomerURN, Value1, Value2

我想将所有这些表组合成一个表 ( sample_results),其形式为...
- SourceTableName、CustomerURN、Value1、Value2

但是,应该复制的唯一记录应该是(customers)表中存在的 CustomerURN。


我可以使用硬编码格式执行此操作proc sql,例如...

proc sql;
insert into
  SAMPLE_RESULTS
select
  'TABLE1',
  data.*
from 
  Table1    data
INNER JOIN
  customers
    ON data.CustomerURN = customers.CustomerURN

<repeat for every table>

但是每周都会将新记录添加到hierarchy表中。

有没有办法编写一个从hierarchy表中获取表名的循环,然后调用将proc sql数据复制到sample_results

4

2 回答 2

1

您可以将所有层次结构表连接在一起,并执行单个 SQL 连接

proc sql ;
  drop table all_hier_tables ;
quit ;

    %MACRO FLAG_APPEND(DSN) ;
      /* Create new var with tablename */
      data &DSN._b ;
        length SourceTableName $32. ;
        SourceTableName = "&DSN" ;
        set &DSN ;
      run ;

      /* Append to master */
      proc append data=&DSN._b base=all_hier_tables force ; 
      run ;
    %MEND ;

    /* Append all hierarchy tables together */
    data _null_ ;
      set hierarchy ;
      code = cats('%FLAG_APPEND(' , SourceTableName , ');') ;
      call execute(code); /* run the macro */
    run ;

    /* Now merge in... */
    proc sql;
    insert into
      SAMPLE_RESULTS
    select
      data.*
    from 
      all_hier_tables data
    INNER JOIN
      customers
        ON data.CustomerURN = customers.CustomerURN
quit;
于 2012-06-20T13:22:34.307 回答
0

另一种方法是创建一个视图,以便它始终反映元数据表中的最新数据。调用执行函数用于从层次数据集中读取表名。这是一个示例,您应该可以对其进行修改以适合您的数据,最后一段代码与您相关。

data class1 class2 class3;
set sashelp.class;
run;

data hierarchy;
input table_name $;
cards;
class1
class2
class3
;
run;

data ages;
input age;
cards;
11
13
15
;
run;

data _null_;
set hierarchy end=last;
if _n_=1 then call execute('proc sql; create view sample_results_view as ' );
if not last then call execute('select * from '||trim(table_name)||' where age in (select age from ages) union all ');
if last then call execute('select * from '||trim(table_name)||' where age in (select age from ages); quit;');
run;
于 2012-06-20T13:59:54.680 回答