Wow thanks guys, I didn't expect a reply so soon Those are all good ideas, in the end I went with Linlin & Saskiwi's suggestions. Here's the finished code: %MACRO unite_tables(input_tables,output_table); /* Read the number of rows in each table into variables. */ %LET num_input_tables = %EVAL(%SYSFUNC(COUNT(&input_tables.,*))+1); %DO i=1 %TO &num_input_tables.; %LET input_table_&i. = %SCAN(&input_tables.,&i.,*); DATA Spine_&i.; SET &&input_table_&i..; Spine=_N_; CALL SYMPUT("num_rows_&i.",COMPRESS(_N_)); RUN; %END; /* Create a "spine" table to join the others on to. */ DATA Spine; DO Spine=1 TO MAX(&num_rows_1.%DO i=1 %TO 2;,&&num_rows_&i.. %END;); OUTPUT; END; RUN; /* Unite tables. */ PROC SQL; CREATE TABLE &output_table. AS SELECT S.Spine %DO i=1 %TO &num_input_tables.; , A&i..* %END; FROM Spine S %DO i=1 %TO &num_input_tables.; LEFT JOIN Spine_&i. A&i. ON S.Spine = A&i..Spine %END; ; RUN; DATA &output_table.; SET &output_table.; DROP Spine; RUN; %MEND unite_tables; What it does it take a given group of tables and blindly attach them to each other horizontally (makes it easier to copy and paste multiple datasets into Excel or whatever for adhoc work)... I don't know if SAS has an inbuilt way of doing this so I've always just made macros for it.
... View more