7
2

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 1 year has passed since last update.

Tableau リレーションシップで INNER JOIN 問題の回避方法

Posted at

これは何

Tableau でテーブル同士を(結合ではなく)リレーションシップでつないでいる場合、
LEFT JOIN 的な動きを期待しているのに、たまに INNER JOIN 的な動きになってしまい、
困ることがある。
ので、その回避策。

アドホック的な回避策な気もしますが、
これに気づく前は、毎回LODで計算フィールドを作っていたので、これで回避できるのであればお手軽で便利。

概要

結合で明示的に LEFT JOIN をしたり、リレーションシップのまま LOD 計算を使って回避していたけど、以下の方法で割と簡単に期待する動きになることが多いのでメモ。

回避方法は、
JOIN の相手レコードがいない場合でも表示したいテーブル側(LEFT JOINなら左側、RIGHT JOIN なら右側)の(既定で用意されている)レコードカウント数のフィールドを表の「詳細」または「テキスト」として入れてあげる、
というもの。

それにより、そのテーブルが(相手側のレコードの有無に関わらず)(フィルタをかけた後の)レコード全件が対象となり、求める結果となる。

簡単なテーブルを例に動きを見る。

テーブル

テーブル1
テーブル1.png

テーブル2
テーブル2.png

リレーションシップ

JOIN KEY
サブID
リレーション.png

ID 3,5 は サブID が NULL のため、テーブル2 と JOIN されるレコードがない。
また、逆に テーブル2 の サブID 13 は、テーブル1 に該当するレコードがない。

ビューを作成

  • テーブル1 の「ID」と「氏名」を行に入れる

    • 5行が表示される
      ID氏名のみ.png
  • 続いて、テーブル2 の「趣味」を行に追加する

    • 表示が 3行になる
      • INNER JOIN 的に動き、テーブル1 と テーブル2 両方に存在している 3行だけになる
        趣味追加.png

いや、そうじゃない。
ID1〜5 の5人の趣味が見たかったんだ。
趣味のレコードがないなら、NULLとして表示して欲しいんだ。

ということで、ここから回避策

  • テーブル1 の「テーブル1 (カウント)」をマークとして入れる

    • ID 3,5の行が「趣味」が NULL として表示される
      テーブル1カウント追加.png
  • ちなみに、上図では「テキスト」として入れて表示させているが、マークの種類を「詳細」として表に出さなくても回避はできる
    テーブル1カウント詳細.png

参考

  • テーブル1 ではなく、「テーブル2 (カウント)」を入れると、テーブル1 にはないが、テーブル2 のみに存在しているレコードが表示される

    • つまり RIGHT JOIN
      テーブル2カウント.png
  • テーブル1、2 の両方の「(カウント)」をマークに入れると、OUTER JOIN の結果になる
    テーブル12カウント.png

まとめ

リレーションシップを使っている時に、特定のテーブルのディメンションをビューの要素として追加した際に、
LEFT JOIN として動いてほしいのに INNER JOIN になってしまい必要な行が表示されない(対象レコードに含まれない)場合に、
LEFT側のテーブルのカウントフィールドをマークに追加することで明示的に LEFT JOIN にすることができる。

こういうやり方もあるよ、こういうケースの場合だと回避できないよ、といったことがあればコメントいただけるとうれしいです。

7
2
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
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?