2012-06-20 2 views
1

Я пришел в конце проекта и хочу написать макрос, который нормализует некоторые данные для экспорта на SQL Server.SAS Macro - Объединение нескольких таблиц в один, управляемый другой таблицей

Есть два контрольных таблиц ...
- Таблица 1 (customers) имеют список клиентов уникальных идентификаторов
- Таблица 2 (hierarchy) содержат список имен таблиц

Есть то n дополнительных таблиц. Один для каждой записи в (hierarchy)(названный в поле SourceTableName). С формой ...
- CustomerURN, значение1, значение2

Я хочу, чтобы объединить все эти таблицы в одну таблицу (sample_results), с формой ...
- SourceTableName, CustomerURN, Value1 , Value2

Однако единственные записи, которые следует скопировать, должны быть для клиентов, которые существуют в таблице (customers).


Я мог бы сделать это в жестко закодированного формате с использованием 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?

ответ

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; 
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; 
Смежные вопросы