2017-05-09 17 views
1

私が書いているSASプログラムでは、4つの異なる作業テーブルを1つのテーブルに結合するのと同等の処理を行う必要があります。私は最初にPROC SQLでそれをやろうとしていましたが、それはすぐに手を抜いてしまったので、データステップでMERGEを設定することにしました。一例として、複数のテーブルを1つのPROC SORTで並べ替える

proc sort data = TABLE_1; by COL1 COL2 COL3; 
proc sort data = TABLE_2; by COL1 COL2 COL3; 
proc sort data = TABLE_3; by COL1 COL2 COL3; 
proc sort data = TABLE_4; by COL1 COL2 COL3; 

data NEW_TABLE; 
    merge TABLE_1 TABLE_2 TABLE_3 TABLE_4; 
    by COL1 COL2 COL3; 

まったく同じフィールドセットで個別に各テーブルをソートする必要があるために種類の面倒なようです。私は、列名のリストと同等になるようにマクロ変数を設定しましたが、各テーブルに対して1つの行が必要です。

PROC SORTを複数のテーブルに同時に書き込む方法はありますか?私は、SASの知っているから、私は仕事にこのような何かを期待する:

proc sort data = (TABLE_1 TABLE_2 TABLE_3 TABLE_4); by COL1 COL2 COL3; 

、さらにはこのような何か、テーブルはこの例のよう番号を付けた場合:

proc sort data = (TABLE_1-TABLE_4); by COL1 COL2 COL3; 

しかし、私はしましたいずれかの仕事をすることができませんでした。確かに私は配列を通して設定しようとはしていないが、それはそのような短いテーブルのリスト(テーブルの長いリストは恐らく別のマージソリューションを完全に保証するだろう)のために過剰なもののように思えるからだ。

応答hereから判断すると、複数のテーブルでPROCを一度に実行することについて楽観的ではありませんが、ソートの仕方は異なっています。

+0

MERGEとFULL JOINは、多対多の一致を別々に処理することを忘れないでください。 – Tom

+0

'proc sql'は最初にソートせずに複数のテーブルに同時に参加できますが、それほど効率的ではありません。 – david25272

答えて

3

いいえ、1 PROC SORTを持つことはできません。複数の表を並べ替えることはできません。面倒なコードを書くためのマクロを作成することができます。このよう

%macro sortem(tables,byvar); 
%local i n table; 
%let n=%sysfunc(countw(&tables)); 
%do i=1 %to &n; 
    %let table=%scan(&tables,&i); 
    proc sort data=&table; 
    by &byvar; 
    run; 
%end; 
%mend; 

は、それが第二答え価値がある

%sortem(table_1 table_2 table_3 table_4, COL1 COL2 COL3); 
+0

ありがとう、私は応答を感謝します。私は質問に「はい」があることへの希望はあまりありませんでしたが、私が検索したときに正直に何かを見つけることができませんでした。これは私の少数のテーブルでは過度に思えるかもしれませんが、PROCをループするのは全体的に最良のソリューションのようです。 – Etheur

+1

このマクロの良い点は、1つのテーブルと1000のテーブルで動作することです。一度マクロを書き、それをあなたのすべてのコードに組み込み、必要に応じてPROC SORTの代わりに使用してください。 – DomPazz

1

を呼び出します。 SASの最新バージョンをお持ちの場合は、PROC DS2を使用してマージを実行できます。 DS2では、テーブルを事前にソートする必要はありません。以下の例を参照してください。

data table1; 
do x=1 to 100; 
    a = rannor(1); 
    output; 
end; 
run; 

data table2; /*Reverse order*/ 
do x=100 to 1 by -1; 
    b = rannor(2); 
    output; 
end; 
run; 

data table3; 
do x=1 to 100; 
    c = rannor(3); 
    output; 
end; 
run; 

proc sort data=table3; /*Make Table3 out of order*/ 
by c; 
run; 

proc ds2 ; 
data work.comb /overwrite=yes; 
    method run(); 
    merge table1 table2 table3; 
    by x; 
    end; 
enddata; 
run; 
quit; 
+0

面白いですが、SASの私のバージョンのようには見えません(私は9.3にあり、PROC DS2は9.4にあります)。私の質問はちょうどより進んだバージョンでサイドステップできることを知ってうれしいです。 – Etheur

関連する問題