2016-02-14 2 views
0

Я пытаюсь functionise некоторые из моих операций SASкак автоматически присоединиться куча Sas наборов данных

У меня есть куча таблиц, которые все имеют одинаковый индекс (ID) и такое же количество строк

Каждый раз, когда я вызываю функцию, которую я хочу написать, количество таблиц может отличаться. Я намерен хранить имена таблиц в наборе данных для их циклирования. Иногда бывает только 3 таблицы, но иногда может быть сотни

Как написать автоматическое соединение ко всем таблицам, но сохранить только один столбец «ID» - идентификатор существует во всех таблицах, поэтому я хотел бы отбросить их все, кроме первой таблицы, которую я присоединяю.

+0

Я предполагаю, что вы имеете в виду макрос здесь. Если вы публикуете свой макрос, мы можем делать предложения, но, поскольку ваш вопрос сформулирован, слишком много возможных ответов. Если вы используете Data Step vs PROC SQL, ответы будут отличаться. – Reeza

+0

ОК - я понимаю, что мой вопрос слишком общий. это будет proc sql, а не шаг данных – shecode

+0

. Мой следующий вопрос - вы уверены, что вам нужно присоединиться, а не добавлять. Длинные данные легче автоматизировать, чем широкие данные. И вы всегда можете перенести его, если потребуется. – Reeza

ответ

0

Если вы хотите, чтобы PROC SQL вычислил ключевую переменную (ы) для вас, используйте операцию NATURAL JOIN. Если некоторые идентификаторы появятся в некоторых наборах данных, а не другие, то используйте NATURAL FULL JOIN.

data a (keep=id a1 a2) b(keep=id b1 b2) c(keep=id c1 c2) ; 
    input id a1 a2 b1 b2 c1 c2 ; 
    if id ne 1 then output a; 
    if id ne 2 then output b; 
    if id ne 3 then output c; 
cards; 
1 1 2 3 4 5 6 
2 7 8 9 10 11 12 
3 13 14 15 16 17 18 
;;;; 
proc sql noprint ; 
    create table want as 
    select * from c natural full join 
    (select * from b natural full join a) 
    ; 
quit; 

Что дает:

enter image description here

0

Я думаю, что следующий будет делать то, что вы ищете. Посмотрите, и если у вас есть какие-либо вопросы, отправьте ответ:

data test.table1;                              
ID = 1;                                 
A=7;                                 
B=8;                                 
OUTPUT;                                 
ID = 2;                                 
A=9;                                 
B=10;                                 
OUTPUT;                                 
ID = 3;                                 
A=11;                                 
B=12;                                 
OUTPUT;                                 
RUN;                                 


data test.table2;                              
ID = 1;                                 
C=9;                                 
D=10;                                 
OUTPUT;                                 
ID = 2;                                 
C=11;                                 
D=12;                                 
OUTPUT;                                 
ID = 3;                                 
C=13;                                 
D=14;                                 
OUTPUT;                                 
RUN;                                 


data test.table3;                              
ID = 1;                                 
E=11;                                 
F=12;                                 
OUTPUT;                                 
ID = 2;                                 
E=13;                                 
F=14;                                 
OUTPUT;                                 
ID = 3;                                 
E=15;                                 
F=16;                                 
OUTPUT;                                 
RUN;                                 


proc sql noprint;                              
    create table test.names_tables as                         
    select distinct libname,memname                          
    from sashelp.vcolumn                             
    where libname = "TEST"                            
    and substr(memname,1,5)="TABLE";                          
quit;                                 

proc sql noprint;                              
    select count(*) into: cnt                           
    from test.names_tables;                            
quit;                                 

%let cnt = &cnt;                               

%macro jmac;                                


proc sql noprint;                              
    select libname,memname into: lib, :table                       
    from test.names_tables                            
    where monotonic() = 1;                            
quit;                                 

%let lib = &lib;                               
%let table = &table;                              

%let fname = &lib..&table;                            

data test.tablejoin;                              
set &fname;                                
run;                                  

%let fname = test.tablejoin;                            

%do i=2 %to &cnt;                              
proc sql noprint;                              
    select libname,memname into: lib1, :table1                       
    from test.names_tables                            
    where monotonic() = &i;                            
quit;                                 

%let fname1 = &lib1..&table1;                           


proc sql noprint;                              
    create table &fname as                            
    select a.*,b.*                              
    from &fname as a                             
    full join                               
      &fname1 as b                             
    on a.id = b.id;                              
quit;                                 


%end;                                 

%mend jmac;                                
%jmac;