1

プロジェクトに遅れて参加し、SQL Server にエクスポートするデータを正規化するマクロを作成したいと考えています。

2 つの制御テーブルがあります...
- テーブル 1(customers)には顧客固有 ID のリストがあります
- テーブル 2(hierarchy)にはテーブル名のリストがあります

その後、n追加のテーブルがあります。(hierarchy) (SourceTableName フィールドで名前が付けられた) のレコードごとに 1 つ。次の形式で...
- CustomerURN、Value1、Value2

これらすべてのテーブルを 1 つのテーブル ( ) に結合したいと考えています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

もう 1 つの方法は、常にメタデータ テーブルの最新データを反映するようにビューを作成することです。call execute 関数を使用して、階層データセットからテーブル名を読み込みます。これは、データに合わせて変更できるはずの例です。コードの最後のビットは、関連するものです。

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 に答える