web-dev-qa-db-ja.com

Excelで完全外部結合をシミュレートする方法

実際のデータベースではなくExcelにデータがあるとしましょう。 1つのシートに、1つの列がIDとして機能するデータがあり、この列の値が一意であることを確認しました。別のシートで、私はまたIDとみなすことができる1つの列を持ついくつかのデータを持っています、そしてそれはまたユニークです。シート1の行Nに何らかの値があり、シート2の行Mに同じ値がある場合、行Nと行Mは同じ実世界オブジェクトを記述しているはずです。

私が求めているのは、どのようにしてマクロを書かずに完全外部結合と同等のものを得ることができるのでしょうか。リボンからアクセスできる数式やすべての機能は問題ありません。

小さな「プレイデータ」の例:

シート1:

Dostoyevski    Russia
Pushkin        Russia
Shelley        England
Flaubert       France
Hugo           France
Eichendorff    Germany
Byron          England
Zola           France

シート2:

Shelley        Percy Bysshe
Eichendorff    Josef Freiherr Von
Flaubert       Gustave
Byron          Lord
Keller         Gottfried
Dostoyevski    Fyodor
Zola           Emile
Balzac         Honoré de

希望する出力(ソートは重要ではありません)

Dostoyevski    Russia   Fyodor
Pushkin        Russia
Shelley        England  Percy Bysshe
Flaubert       France   Gustave
Hugo           France
Eichendorff    Germany  Josef Freiherr von
Byron          England  Lord
Zola           France   Emile
Keller                  Gottfried
Balzac                  Honoré de

このシナリオに怯えている人は誰にでも:これは間違ったやり方であることを私は知っています。私が何か選択肢があるならば、私はこれのためにExcelを使用しないではないでしょう。ただし、実際的な解決策が必要な状況は十分にあり、stat、および(ITの観点から)より良い解決策は適用できません。

30
rumtscho

簡単なアプローチ - 標準のExcel操作

まず、両方のテーブルから両方のキー列を1つの新しいシートに1列としてコピー&ペーストします。

「重複の削除」を使用して、すべての一意のキーの単一のリストを取得してください。

次に、各表の各データ列に1つずつ、合計2つの列(この場合)を追加します。数式をより見やすくするために、テーブルオプションとしてフォーマットを使用することをお勧めします。 vlookupを使用して、次の式を使用してください。

=IFERROR(VLOOKUP([@ID],Sheet4!A:B,2,FALSE),"")

ここで、Sheet4!A:Bは、ソーステーブルのデータテーブルがそれぞれの値ごとに何であるかを表します。 IFERRORは、vlookupが成功しなかった場合に表示される#N/Aという見苦しい結果を防ぎ、この場合は空白のセルを返します。

これであなたの結果テーブルが得られます。


シート3:

enter image description here

シート4:

enter image description here

結果データ:

enter image description here

結果の式(Ctrl+~ これを切り替えます。

enter image description here


SQLクエリを内蔵

組み込みのSQLクエリでもこれを行うことができます。それは...はるかにユーザーフレンドリーではありませんが、おそらくより良いユースケースになるでしょう。これはおそらくあなたが「ソース」データをテーブルとしてフォーマットしていることを要求するでしょう。

  1. 新しいシートのセルをクリック
  2. データ - >他のソースから - > Microsoft Queryから
  3. [データベース]タブで[Excelファイル]を選択し、[OK]をクリックします。
  4. ワークブックを選択してください
  5. 以下の4つのフィールドを選択してください。
    • enter image description here
  6. 表示されるNice 1990s形式の警告で[次へ]と[OK]をクリックします。
  7. 続く これらの指示 最初の左外部結合を作成します。私の場合、私は左側の情報源として"国 "の表を使い、右側として"名前 "を使っています。
    • enter image description here
    • これはいくつかの行だけを与えます(あなたがIDに加わるので)
  8. 「減算結合を作成してから結合として追加する」部分はもっと複雑です。

    • これが減算結合構成です。 enter image description here
    • SQLボタンからこの結合のSQLをコピーします。
    • SELECT countries$.ID、countries$。VAL1、names$.ID、names$.Val2 FROM {OJ C:\Users\Username\Desktop\Book2.xlsx.countries$countries$ LEFT OUTER JOINをC:\Users\Username\Desktop\Book2.xlsx.names$names$ ON countries$.ID = names$.ID} WHERE(names$.IDあるNULL)

  9. 作成した最初の外部結合に戻ります。 SQLを手動で編集して

    • 一番下にUnionを追加
    • 上記の減算結合テキストを結合の下部に追加します。
  10. SQLボタンのすぐ左にある[Return Data]ボタンを押します。
    • この時点で必要な特定のデータのみを選択するようにSQLを編集することをお勧めします。結果の列を非表示にする方が簡単だと思います。
  11. クエリをどこかに置き、その場所を確認します。
    • enter image description here

失神のためではありません。しかし、Officeの更新されていない部分が生き生きとしている部分を目にする機会がほしいのであれば、それは大きなチャンスです。

41
enderland

別の解決策として、 Power Query を提案できますか。これは、基本的にまさにこの種のことを実行するためのMicrosoftからの無料のExcelアドインです。その機能は実際にはExcel 2016にも直接含まれるため、将来的には使用できなくなります。

とにかく、Power Queryを使えば、ステップはかなり単純です。

  1. 両方のテーブルをクエリとしてPower Query Editorにインポートします。
  2. それらに対してMerge Queriesトランスフォーメーションを実行し、適切なジョイン列を設定し、ジョインタイプをFull Outerに設定します。
  3. 結果表を新しいシートにロードします。

これに関して素晴らしいことは、一度あなたがこれを設定したら、あなたがあなたの基本データテーブルに変更を加えるならば、あなたはちょうどData> Refresh Allを押すと、あなたのPower Query結果シートも同様に更新される。

13
Kyle Hale