見出し画像

Tableau のリレーションシップ機能 その2 ~ リレーションシップ ~

前回記事では、復習を兼ねて "結合" について説明しました。いよいよ "リレーションシップ" に入っていきます。

Tableau で最初にやることは "データ接続" です。Tableau 自身は何もデータを持っていませんので、Tableauで分析やデータの可視化を行うには、先ず、外部にあるデータに接続しなければなりません。接続するデータの表 (テーブル) が一つなら簡単です。画面左にあるテーブルリストからテーブルを選んで、画面中央にドラッグ&ドロップするだけ。ところが前回も申し上げたように、実際の利用シーンでは、複数のテーブルを使用しなければならないことがほとんどです。複数のテーブルを使用する時は、別のテーブルも画面中央にドラッグ&ドロップしていきます。両方のテーブルに同じフィールド名が存在すれば、Tableauは、ある程度自動的にテーブ同士の関係性を作成してくれます。しかしながら、どういう関係性で繋ぐか?は必ず自分で確認するようにしましょう。また、フィールド名が異なるものを関係付ける場合は、自分で関係性を作成する必要があります。

今回も前回と同じサンプルデータを使います。サンプルデータは元テーブルを区別し易くするため、あえてフィールド名を変えています。従って2つのテーブルを画面中央へドラッグ&ドロップしたらテーブルの関連性を作成しましょう。


さて、リレーションの最初の実験です。
Tableau のワークシートに移り、次の操作を行ってみて下さい。
① TRAN_01 にある T_CST_CD を行にドラッグ
② CST_01 にある C_CST_CD を行にドラッグ
すると以下の結果が現れます。

CST_CD 同士の内部結合 (INNER JOIN) と同じ

即ち、TRAN_01 と CST_01 が 双方の CST_CD で内部結合 (INNER JOIN) された時と同じ状態になります。リレーションでは集計が行われない限り、リレーションで定義された関係は、内部結合が実行されます。

次に、この状態に TRAN_01 にある T_QTY をマークカードの [テキスト] にドラッグしてみましょう。結果は以下のようになります。

CST_CD 同士の左結合 (LEFT JOIN) と同じ

T_QTY が集計され、合計になっています。結果は、TRAN_01 の T_CST_CD に CST_01 の C_CST_CD を左結合し、T_QTY の合計を集計した状態になっています。

では、T_QTY を、CST_01 にある C_AGE に変えたらどうなるでしょう?

CST_CD 同士の右結合 (RIGHT JOIN) と同じ

今度は、TRAN_01 の T_CST_CD に CST_01 の C_CST_CD を右結合し、C_AGE の合計を集計した状態になっています。

ここで言えることは、ワークシートに配置するディメンションとメジャーの配置によって、Tableau が実行する "結合" が変わってくる、ということです。"リレーション" を作成した時、"結合"で行っていた [結合種類の設定] はありませんでした。"リレーション" での結合は、ワークシートに配置したフィールドによって、最適な状態で行われます。これは "結合" がよく理解出来ていないユーザーにとっては大きなメリットです。"結合" は難解なことも多く Tableauを使い始めて間もないユーザーにとっては結合の種類を意識することなく "結合" を行うことができます。一方、従来の "結合" に慣れ親しんだユーザーにとっては、自分の意思で結合を決定できないので、頭の中で混乱が生じます。これがデータベースに詳しい方が陥る不信感に繋がっています。ならば、リレーションシップで何が行われているのか? SQLから見てみましょう。

先ずは、最初の CST_CDだけの場合、次の SQLが実行されています。
INNER JOIN です。

INNER JOIN

次に、TRN_01 の T_QTY をテキストに配置した場合、
少し複雑になっていますが、TRAN_01 を主テーブルとし、CST_01 が LEFT JOIN されています。そして TRAN_01 側の T_CST_CD で GROUP BY を行い、T_QTY を集計しています。また TRN_01 側の CST_CD は集計され最小値になっています。LEFT JOIN の中はサブクエリーになっていますが、CST_01 からワークシートで選択した C_CST_CD で 集約 (GROU BY) が行われてから LEFT JOIN が行われている点は、リレーションの重要なポイントになります。

TRAN_01 に CAT_01 を LEFT JOIN

CST_01 の C_AGE をテキストに配置した場合、
CST_01 を主テーブルとし、TRAN_01 が LEFT JOIN されています。そして CST_01 側の C_CST_CD で GROUP BY を行い、C_AGE を集計しています。また CST_01 側の CST_CD は集計され最小値になっています。

CST_01 にTRAN_01 を LEFT JOIN

ここで確認できるように、リレーションは、集計が行われない限り INNER JOINを行います。集計が必要になると集計するフィールドが含まれる側のテーブルを主テーブルとし、他方のテーブルのフィールドを使った場合は、LEFT JOIN して最小値を取得しているのです。SQLをご存じない方にとっては少し難しいかも知れませんが、ご存じの方は「なるほど!」と合点頂けるのではないかと思います。

ここで注目頂きたいのは、最初の CST_CDだけの SQLです。よく見て頂くと、TRAN_01 の T_CST_CD と CST_01 の C_CST_CD を行に配置しているのに、SELECT 文には TRAN_01 の T_CST_CD しか在りません。恐らくは、集計を行わないので INNER JOIN と判断し、INNER JOIN であれば、関係付けを行ったフィールドは同じ内容が返ってくるので省略しているのではないかと思われますが、SELECT文に書かれていないのに Tableauが結果を表示しているのは不思議な気もします。これは Tableauが内部的に生成して表示しているのはないか?と想像します。そしてこのことが、後の私に、とんでもない事態を引き起こした原因でもありました。そのことは後々ご説明させて頂こうと思ってますが、先ずは、リレーションシップの基本的な挙動ついて、今回の事例でご理解頂けたらと思います。

次回は、これをもう少し深めていきます。


この記事が気に入ったらサポートをしてみませんか?