前のページ|次のページ

MERGEステートメント

複数のSASデータセットにある複数のオブザベーションを1つのオブザベーションに結合します。

該当要素: DATAステップ
カテゴリ: ファイル操作
種類: 実行
注: MERGEステートメントを使用して読み込まれた変数はPDVで保持されます。詳細については、XisError: No pubcode in link data found for lrconおよびRETAINステートメントを参照してください。

構文

引数

SAS-data-set

オブザベーションを読み込む既存のSASデータセットを少なくとも2つ指定します。データセットは個別に指定するか、データセットのリストで指定します。また、両方を組み合わせても指定できます。

ヒント データセット名を使用するかわりに、オペレーティングシステムでサポートされている構文を使用してファイルの物理パス名を指定することができます。物理パス名は一重引用符または二重引用符で囲む必要があります。
追加するSASデータセットを指定できます。
参照項目 MERGEステートメントでデータセットリストを使用する

(data-set-options)

SASデータセット名の後ろに、1つまたは複数のSASデータセットオプションを丸かっこで囲んで指定します。

データセットオプションは、処理対象のオブザベーションをDATAステップに読み込むときに実行するアクションを指定します。データセットオプションのリストについては、次を参照してください。 SASデータセットオプション: リファレンス
ヒント データセットリストに適用するデータセットオプションは、データセットリストに存在するすべてのデータセットに適用されます。

END=variable

作成する一時変数の名前を指定します。この変数の値には終端指示子が格納されます。

この変数は0に初期化されますが、MERGEステートメントが最後のオブザベーションを処理するときに1に設定されます。各入力データセットに存在するオブザベーションの数が異なる場合は、MERGEステートメントによってすべてのデータセットの最後のオブザベーションが処理されるときに、END=変数が1に設定されます。
ヒント END=変数は、作成されるSASデータセットには追加されません。

詳細

概要

MERGEステートメントには柔軟性があり、SASプログラミングでさまざまな方法で使用されます。次のセクションでは、MERGEステートメントの基本的な使用方法を説明します。応用として、2つ以上のBY変数の使用、3つ以上のデータセットのマージ、少数のオブザベーションを別のデータセットの全オブザベーションへのマージなどがあります。
詳細については、XisError: No pubcode in link data found for lrconを参照してください。

MERGEステートメントでデータセットリストを使用する

MERGEステートメントでは、データセットのリストを使用できます。データセットリストを使用すると、現在存在するデータセットのグループを簡単に示せます。このデータセットリストには、名前接頭辞リストまたは番号付き範囲リストを指定する必要があります。
名前接頭辞リストは、指定した文字列で始まるすべてのデータセットを示します。たとえば、merge SALES1:;と指定すると、"SALES1"で始まるSALES1、SALES10、SALES11、SALES12などのデータセットがすべてマージされます。
番号付き範囲リストでは、連番である最後の文字を除き、同じ名前のデータセットが存在する必要があります。番号付き範囲リストでは、開始値と終了値に任意の数値を使用してもかまいません。たとえば、次のリストは同じデータセットを示します。
sales1 sales2 sales3 sales4
sales1-sales4
注: 最初のデータセット名にある数値接尾辞の先頭に0が置かれる場合、最後のデータセット名の数値接尾辞の桁数は最初のデータセット名の桁数と一致するか、または上回る必要があります。このように指定されていない場合はエラーが発生します。たとえば、データセットリストをsales001–sales99またはsales01–sales9と指定するとエラーが発生します。ただし、このデータセットリストの有効な指定は、sales001–sales999です。最初のデータセット名にある数値接尾辞の先頭に0が置かれない場合、最初と最後のデータセット名に使用する数値接尾辞の桁数を一致させる必要はありません。たとえば、データセットリストの指定としてsales1–sales999は有効です。
番号付きデータセットリストを使用する場合に考慮すべきその他のルールを次に示します。
  • 範囲のグループを複数指定できます。
    merge cost1-cost4 cost11-cost14 cost21-cost24; 
  • 番号付き範囲リストと名前接頭辞リストを組み合わせて指定できます。
    merge cost1-cost4 cost2: cost33-37;
  • 個々のデータセットとデータセットリストを組み合わせて指定できます。
    merge cost1 cost10-cost20 cost30;
  • データセットリストを囲んだ引用符は無視されます。
    /* these two lines are the same */
    merge sales1-sales4;
    merge 'sales1'n-'sales4'n;
  • データセット名のブランクは無効です。引用符を使用する場合、末尾にあるブランクは無視されます。
    /* blanks in these statements will cause errors */
    merge sales 1-sales 4;
    merge 'sales 1'n - 'sales 4'n;
    /* trailing blanks in this statement will be ignored */
    merge 'sales1'n - 'sales4'n;
  • 数値接尾辞に使用できる最大数は、2147483647です。
    /* this suffix will cause an error */
    merge prod2000000000-prod2934850239;
  • 物理パス名を使用できません。
    /* physical pathnames will cause an error */
    %let work_path = %sysfunc(pathname(WORK));
    merge "&work_path\dept.sas7bdat"-"&work_path\emp.sas7bdat" ;

1対1のマージ

1対1マージでは、複数のSASデータセット間でオブザベーションを結合してから、新しいデータセットに1つのオブザベーションを作成します。1対1のマージを実行するには、BYステートメントを指定せずにMERGEステートメントを使用します。MERGEステートメントに指定したすべてのデータセットの最初のオブザベーションを結合してから、新しいデータセットに最初のオブザベーションを作成します。次に、すべてのデータセットの2番目のオブザベーションを結合して、新しいデータセットに2番目のオブザベーションを作成します。同様の作業が繰り返されます。1対1マージでは、新しいデータセットに作成されるオブザベーションの数は、MERGEステートメントに指定した最大データセットのオブザベーションの数と一致します。1対1マージについては、例1を参照してください。詳細については、XisError: No pubcode in link data found for lrconを参照してください。
注意:
1対1マージを使用してデータセットを結合する場合は注意が必要です。
1対1マージでは、予期しない結果が発生する場合があります。この方法を使用する前に、データセットのサンプルを使用してプログラムのテストを実行してください。

マッチマージ

マッチマージでは、複数のSASデータセットにあるオブザベーションを共通する変数の値に基づいて結合してから、新しいデータセットに1つのオブザベーションを作成します。新しいデータセットに含まれるオブザベーションの数は、すべてのデータセットの各BYグループに含まれるオブザベーションのうち、最も数が多いオブザベーションの合計になります。マッチマージを実行するには、MERGEステートメントの直後にBYステートメントを使用する必要があります。BYステートメントに指定する変数は、すべてのデータセットに共通している必要があります。DATAステップでは、1つのBYステートメントのみ、MERGEステートメントに指定できます。MERGEステートメントにリストされるデータセットは、BYステートメントにリストされる変数の値に基づいて並べ替えられているか、適切なインデックスが含まれている必要があります。マッチマージについては、例2を参照してください。詳細については、XisError: No pubcode in link data found for lrconを参照してください。
注: MERGEステートメントは、1対1のマッチマージではデカルト積を生成しません。そのかわり、MERGEステートメントは、少なくとも1つのデータセット内のBYグループにオブザベーションが存在する間、1対1のマッチマージを実施します。1つのデータセット内にあるBYグループのすべてのオブザベーションを読み込んだ後、別のデータセット内にまだオブザベーションが存在する場合、特定BYグループに関してすべてのオブザベーションが読み込まれるまで、1対1のマッチマージが実行されます。

比較

  • MERGEステートメントでは、複数のデータセットにあるオブザベーションが結合されます。UPDATEステートメントでは、2つのデータセットにあるオブザベーションが結合されます。UPDATEステートメントでは、マスタデータセットにある選択したオブザベーションの値も変更または更新されます。また、UPDATEステートメントによりオブザベーションが追加される場合があります。
  • UPDATEステートメントと同様に、MODIFYステートメントでも、2つのSASデータセットにあるオブザベーションが結合され、マスタデータセットにある選択したオブザベーションの値も変更または更新されます。
  • 2つ以上のSETステートメントを使用してオブザベーションを読み込んだ結果は、BYステートメントを指定せずにMERGEステートメントを使用してオブザベーションを読み込んだ結果と似ています。ただし、SETステートメントを使用すると、すべてのデータセットからオブザベーションをすべて読み込む前に、オブザベーションの数が同一ではない場合は処理が中止されます。これに対して、MERGEステートメントに指定した全データセットの全オブザベーションの処理は続けられます。

例1: 1対1のマージ

この例では、2つのデータセットにあるオブザベーションを結合し、新しいデータセットに1つのオブザベーションを作成する方法を示しています。
data benefits.qtr1;
   merge benefits.jan benefits.feb;
run;

例2: マッチマージ

この例では、2つのデータセットにあるオブザベーションをBYステートメントに指定した変数の値に基づいて結合し、新しいデータセットに1つのオブザベーションを作成する方法を示しています。
data inventry;
   merge stock orders;
   by partnum;
run;

例3: データセットリストを使用したマージ

この例では、データリストを使用してマージ対象のデータセットを定義します。
data d008; job=3; emp=19; run; 
data d009; job=3; sal=50; run; 
data d010; job=4; emp=97; run; 
data d011; job=4; sal=15; run; 
data comb;
   merge d008-d011;
   by job;
run;
proc print data=comb;
run;

関連項目:

XisError: No pubcode in link data found for lrcon
前のページ|次のページ|ページの先頭へ