これは何
Tableau でテーブル同士を(結合ではなく)リレーションシップでつないでいる場合、
LEFT JOIN 的な動きを期待しているのに、たまに INNER JOIN 的な動きになってしまい、
困ることがある。
ので、その回避策。
アドホック的な回避策な気もしますが、
これに気づく前は、毎回LODで計算フィールドを作っていたので、これで回避できるのであればお手軽で便利。
概要
結合で明示的に LEFT JOIN をしたり、リレーションシップのまま LOD 計算を使って回避していたけど、以下の方法で割と簡単に期待する動きになることが多いのでメモ。
回避方法は、
JOIN の相手レコードがいない場合でも表示したいテーブル側(LEFT JOINなら左側、RIGHT JOIN なら右側)の(既定で用意されている)レコードカウント数のフィールドを表の「詳細」または「テキスト」として入れてあげる、
というもの。
それにより、そのテーブルが(相手側のレコードの有無に関わらず)(フィルタをかけた後の)レコード全件が対象となり、求める結果となる。
例
簡単なテーブルを例に動きを見る。
テーブル
リレーションシップ
ID 3,5 は サブID が NULL のため、テーブル2 と JOIN されるレコードがない。
また、逆に テーブル2 の サブID 13 は、テーブル1 に該当するレコードがない。
ビューを作成
-
テーブル1 の「ID」と「氏名」を行に入れる
-
続いて、テーブル2 の「趣味」を行に追加する
いや、そうじゃない。
ID1〜5 の5人の趣味が見たかったんだ。
趣味のレコードがないなら、NULLとして表示して欲しいんだ。
ということで、ここから回避策
-
テーブル1 の「テーブル1 (カウント)」をマークとして入れる
参考
-
テーブル1 ではなく、「テーブル2 (カウント)」を入れると、テーブル1 にはないが、テーブル2 のみに存在しているレコードが表示される
まとめ
リレーションシップを使っている時に、特定のテーブルのディメンションをビューの要素として追加した際に、
LEFT JOIN として動いてほしいのに INNER JOIN になってしまい必要な行が表示されない(対象レコードに含まれない)場合に、
LEFT側のテーブルのカウントフィールドをマークに追加することで明示的に LEFT JOIN にすることができる。
こういうやり方もあるよ、こういうケースの場合だと回避できないよ、といったことがあればコメントいただけるとうれしいです。