0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

データテーブルの連結ー横方向1(完全外部結合)

Last updated at Posted at 2021-02-17

テーブルとテーブルの連結には、縦方向(行が増える)と横方向(列が増える)の場合があります。
縦方向の場合は__集合__、横方向の場合は__結合__と言います。

結合には以下のパターンがあります。
 完全外部結合:共通しないレコードをすべて含めて列を増やす。
 右(左)外部結合:右(左)側のテーブルの共通しないレコードを含めて列を増やす。
 内部結合:共通するレコードを対象として列を増やす。
image.png
今回は、__完全外部結合__について、SAS プログラムと SQL、および Python (Pandas) をそれぞれ用いた例を紹介します。

行いたい操作は下記です。
image.png
A列をキーとして、値が一致するしないに関わらずすべてのレコードを取り出して、横方向に連結します。

####① SAS プログラムでの完全外部結合

data table_3;
  merge table_1 table_2;
  by a;
run;

merge ステートメントで横に重ねることができます。
by に続く変数がキーとなります。
image.png

####② SQL での完全外部結合

 create table  table_3 as
 select coalesce(table_1.A, table_2.A) as A, B, C 
 from table_1 full join table_2  on  table_1.A = table_2.A ;

SELECT 取り出す変数名 from データセット1 full join データセット2 on 結合条件

SELECT文で coalesce という関数を使ってます。与えられた引数のうち、NULLでない最初の引数を返します。
coalesce 関数につきましては、詳しくは下記リンクを参照下さい。
 https://doruby.jp/users/akio0911_on_rails/entries/SQL_coalesce_
 https://tech.adseed.co.jp/sql-coalesce
また、結合する2つのデータセットで同じ変数名を持っている場合、「データセット名.変数名」と書きます。
image.png

####③ Python (Pandas) での完全外部結合

import pandas as pd
table_1 = pd.DataFrame({'A': [1, 2], 'B': ['AA', 'BB']})
table_2 = pd.DataFrame({'A': [2, 3], 'C': [10, 20]})
table_3 = pd.merge(table_1, table_2, on = "A", how="outer")

__ .merge __で結合、on にキー列を指定、how で様式(完全外部なので "outer")を指定します。

出力結果
image.png
ちなみに how の様式指定では、 "inner" が内部結合、"left" ("right") が左 (右) 外部結合となります。

####関連記事
データテーブルの連結-縦方向 1(異なる列名をそのまま残す場合)
データテーブルの連結-縦方向 2(異なる列名を統合する場合)
データテーブルの連結-縦方向 3(積集合と差集合)
データテーブルの連結-横方向 2(内部結合)
データテーブルの連結-横方向 3(左右の外部結合)
データテーブルの連結ー交差結合

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?