BookmarkSubscribeRSS Feed

MERGEステートメントの使用方法

Started ‎03-13-2018 by
Modified ‎04-19-2018 by
Views 659

質問

SASデータセット [MASTER] と [TRAN] には共通の変数KEYとNUMがあります。[TRAN] の内容で [MASTER] を更新したいのですが、[MASTER] にはKEY変数が同じオベザベーションが複数存在するためUPDATEステートメントは使えません。

そこで、MERGEステートメントを使いましたが、各KEY変数の2番目以降のオブザベーションは更新されず、元の値のままになってしまいます。

どうすればよいでしょうか。

 

  [MASTER]        [TRAN]                   [希望の結果]       [実際の結果]
  KEY  NUM       KEY  NUM                  KEY  NUM         KEY  NUM
    A          1          A       100                  A     100             A      100
    A          2       B       200         ==>        A     100             A          2

    B          1                                                   B     200             B      200
    B          2                                                   B     200             B          2
    C          1                                                   C         1             C         1

 

回答

 まず、うまく更新できない理由から説明します。次のプログラムを実行すると [実際の結果] が得られます。 

 

  data wrong;
    merge MASTER TRAN;
    by key;
  run;

 

第1オブザベーションの処理時は、まず[MASTER]のオブザベーション、次に[TRAN]のオブザベーションが読み込まれます。 この順序で読み込まれるため、NUMの値は100となります。 第2オブザベーションの処理を開始したときは、DATAステップの次のルールによって、NUMの値は100のままです。

[MERGE/BYステートメントを組み合わせて読み込むSASデータセット中の変数値は、BYグループが変るとき以外は初期化されない。]

ところが、第2オブザベーションの処理に入ると、MASTER の第2オブザベーションだけが読み込まれ、NUM の値は2になってしまいます。
さて、上のルールを理解すれば、[いったん別の変数として読み込めばよい] ということに気がつきます。次のプログラムを見てください。

 

data correct;
    merge MASTER TRAN(rename=(NUM=NUM2));
    by key;
    drop NUM2;
    if NUM2 ne . then NUM=NUM2;
  run;

 

このプログラムでは、[TRAN] の変数 NUM を変数 NUM2 として読み込んでいます。変数 NUM2 は各グループの先頭で読み込まれ、グループの処理中はその値を維持します。


また、[MASTER] のデータCのように、読み込めるオブザベーションがないときは、その値は欠損値となります。そこで、変数NUM2 が欠損値でないときにだけ値を変数 NUM にコピーすれば、期待する処理結果が得られます。変数NUM2の値の動きを実際に確認する場合は、DROPステートメントを削除して実行してください。

Version history
Last update:
‎04-19-2018 09:24 PM
Updated by:
Contributors

SAS INNOVATE 2024

Innovate_SAS_Blue.png

Registration is open! SAS is returning to Vegas for an AI and analytics experience like no other! Whether you're an executive, manager, end user or SAS partner, SAS Innovate is designed for everyone on your team. Register for just $495 by 12/31/2023.

If you are interested in speaking, there is still time to submit a session idea. More details are posted on the website. 

Register now!

Article Labels
Article Tags

SAS Support Communitiesのユーザーガイドライン


コミュニティの基本的なガイドラインについてご説明します。まずは、こちらをご参照ください。

詳細を読む

 

SAS Support CommunitiesのFAQ


SAS Support CommunitiesのFAQはヘルプに記載されています。参照方法は、こちらからご確認ください。

詳細を読む

 

質問や意見の投稿と返信方法について


Japan SAS Discussionページに質問や意見(メッセージ)を投稿/返信する方法を簡単にご説明します。

詳細を読む