2015年1月19日月曜日

SQLプロシジャ入門14:データセットを縦結合する【UNION】




SQLプロシジャで複数のデータセットを縦結合する方法の紹介です。




サンプルデータ
data DT1;
input A$ B$ ;
cards;
001 aa
002 bb
002 bb
;

data DT2;
input A$ C$;
cards;
002 bb
003 cc
;

DT1
 B 
  001 
  aa   
  002  
  bb  
  002
  bb  

DT2
 A 
C
  002  
  bb   
  003
  cc  




① 「UNION」 と 「UNUION ALL」
proc sql;
   create table DT3 as
   select * from DT1
      union
   select * from DT2;
quit;

DT3
 B 
  001 
  aa   
  002  
  bb  
  003
  cc  

基本構文
SELECT文  union  SELECT文

解説
・SELECT文の結果を縦に結合します。

変数名ではなく変数の順番で結合されます。
(今回の例では、DT1の変数BとDT2の変数Cは同じ2列目にある変数なので、無理矢理BとCを縦にくっつけちゃいます。)

出力データで値が重複してるレコードは、重複分が削除されます
(たとえば、
DT1の 「A="002" and B="bb"」 と、
DT2の 「A="002" and C="bb"」 の3レコードは重複してるので、1レコードだけ残してあとは削除されます。)

重複を削除したくない場合は、「union all」と指定すればok。





② 「UNION CORR」 と 「UNUION CORR ALL」
proc sql;
   create table DT4 as
   select * from DT1
      union corr
   select * from DT2;
quit;

DT4
  001 
  002  
  003

基本構文
SELECT文  union corr  SELECT文

解説
・SELECT文の結果を縦に結合します。

結合時に共通する変数名のみを残します。
(今回の例では、DT1とDT2で共通する変数名はAのみなので、これだけ残る。)

出力データで値が重複してるレコードは、重複分が削除されます
(たとえば、
DT1とDT2の 「A="002"」 の3レコードは重複なので、1レコードだけ残してあとは削除されます。)

重複を削除したくない場合は、「union corr all」と指定すればok。





③ 「OUTER UNION CORR」
proc sql;
   create table DT5 as
   select * from DT1
      outer union corr
   select * from DT2;
quit;

DT5
  A  
  B 
  C  
  001 
  aa  
  002
  bb 

  002
  bb

  002
  
  bb  
  003

  cc



基本構文
SELECT文  outer union corr  SELECT文

解説
・SELECT文の結果を縦に結合します。
・データセット間で共通する変数名同士を結合し、片方にしかない変数も残してくれてます。
重複レコードも削除されません




14.データセットを縦結合する【UNION】
15.NULLの扱いに関する注意点

2 件のコメント:

  1. こんにちは!いつも記事を楽しみにしています。
    matsu a さんの記事がきっかけでSQLを使うようになりました。

    データステップでは面倒な操作が、SQLを使うとシンプルになるケースがあるので
    便利ですね。

    これからも、楽しみにしています。

    返信削除
    返信
    1. コメントありがとうございます!
      そう言って頂けると、とても嬉しいです!

      そうなんです、すごい便利なんです。
      しかもアイディア次第で、色々できて面白いです。

      これからもSQLプロシジャやSASの色々な記事を更新していく予定ですので、
      また何か気付いたこと、感想、アイディアなど、なんでもお待ちしています!

      削除