- データ分析を始めたいが特に使うツールが決まっていない方
- Power BIでどんなことができるか知りたい方
- Power BIを使い始めたばかりで基本から学びたい方
▶ 中間テーブルを作ってリレーションシップの設定をする方法はこちらをご覧ください
▶ カレンダーテーブルの作成方法はこちらの投稿をどうぞ
はじめに
今回は「多対多」のリレーションシップの設定について基本から解説します。「多対多」のリレーション設定の方法は2つあります。1つは「多対多カーディナリティのリレーションシップを使う」方法、もう一つは「中間テーブルを介して設定する」方法です。順にみていきましょう。
多対多リレーションシップの設定
多対多リレーションシップとは2つのテーブルでリレーションシップ設定する際に、「結合のキーとする列がどちらのテーブルでも重複する値を持つ場合のリレーションシップ設定」です。この表現だけだと少しわかりにくいですね。実際の例を示しましょう。
以下のような2つのテーブルで「支店名」をキーとしてリレーション設定するケースを「多対多のリレーションシップ」といいます。

- 「売上テーブル」ではA支店が3つ、B支店が1つ、C支店が2つ、D支店が1つ
- 「来客数テーブル」ではA支店が2つ、B支店が2つ、C支店が1つ、D支店が1つ
のようにキーとする「支店名」がそれぞれのテーブルで重複がある状態です。
多対多カーディナリティを設定する方法
多対多カーディナリティの設定
以前は推奨されていませんでしたが、MicroSoftの公式ドキュメントにも掲載があるので、気を付けて使いましょう、ということなんでしょうね。もともとリレーションシップの設定は1対多を基本としていて、「多対多」のリレーション設定時にはいくつか制限事項があります。設定事項とともに制限事項についても確認していきましょう。
まずはPower BIの実際の画面で設定方法をみていきましょう。

まずは「モデル」を選択して、Power BIに取り込まれているテーブルを確認しましょう。この例では「売上テーブル」と「来客数テーブル」が取り込まれています。この2つのテーブルに共通の項目である「支店名」をキーとしてリレーションシップの設定をおこないます。
操作は簡単で一方の項目を選択して、もう一方のテーブルにドラッグ&ドロップします。すると、「リレーションシップの設定」ダイアログが表示されます。

カーディナリティは「多対多」、クロス フィルターの方向は「双方向」に設定します。クロス フィルターを「双方向」にするとは、テーブルでデータを絞り込んだ(フィルターした)場合に、お互いにフィルターを適用する、という意味です。
上記の設定後、「OK」をクリックすると、以下のように多対多のリレーションシップ設定ができます。

自動でリレーションシップが確立されました。正しくリレーションシップされない場合は、手動で設定しましょう。(列名を同じにしておくと自動でリレーションシップが確立されます)
多対多カーディナリティ設定時の制限事項
多対多のリレーションシップ設定した際に、キーに設定した列がどちらかのテーブルにしかない値がある場合には注意が必要です。これは実例をみながら確認した方がわかりやすいでしょう。
「レポート」画面で集計してみましょう。

まず「レポート」画面(①)を表示して「テーブル」を選択(②)します。次に列の設定ですが、「売上」テーブルから「支店名」「売上」、「来客数」テーブルから来客数を指定(③)します。「支店名」を「売上」テーブルから指定したことに注意してください。
結果をみると、A支店、B支店、D支店の集計結果がありますが、C支店の集計がありません。これは「売上」テーブルにはC支店がなかったため、「支店名」を「売上」テーブルから指定した場合には集計対象とならないのです。
反対に「支店名」を「来客数」テーブルから指定してみましょう。

今度の結果は、A支店、B支店、C支店の集計結果はありますが、D支店はありません。これは「来客数」テーブルにはD支店がなかったため、集計対象になりません。
これが注意事項になります。指定したテーブルの方に存在するキー列の値のみが集計対象になる、ということを覚えておきましょう。
中間テーブルを介して設定する方法
次に中間テーブルを介して設定する方法です。中間テーブルを手動で作ったり、カレンダーテーブルを作る方法は過去にも紹介しました。ここでは選択した複数のテーブルから中間テーブルを作る方法をご紹介します。
まずはPower Query エディタを起動しましょう。「ホーム」メニューの「クエリ」リボンから「データの変換」をクリックします。

Power Queryエディタが起動します。「ホーム」メニューの「結合」リボンの「クエリの追加」のプルダウンメニューから「クエリを新規クエリとして追加」をクリックします。

すると、「追加」ダイアログが表示されます。

ここでテーブルを選んで「OK」をクリックします。ここでは、2つのテーブルから中間テーブルを作るため、「2つのテーブル」を選択して「最初のテーブル」で「売上」テーブルを、「2つ目のテーブル」で「来客数」を選択して「OK」とします。

追加クエリ(①)が作成されます。今回は中間テーブルを作成するだけなので、不要な列は削除(②)しましょう。またクエリの名前は③の箇所で変更することができます。

今回は支店名以外を削除して、クエリの名称を「中間テーブル」としましょう。削除したい列を選択して右クリックするとプルダウンメニューが表示されるので、「列の削除」をクリックします。

次に「支店名」列の重複を削除します。列名を選択した状態で「ホーム」メニューの「行の削減」リボンの「行の削除」のプルダウンメニューから「重複の削除」を選択します。最後に「閉じる」リボンの「閉じて適用」を選択すれば中間テーブルの完成です。

Power BI Desktopに戻るので、「モデル」画面を表示します。次に「売上」テーブルと中間テーブルのリレーション設定(②)、「来客数」テーブルと中間テーブルのリレーション設定をします。これで完成です。
レポート画面で集計してみましょう。

中間テーブルで「支店名」を指定しています。この場合、集計結果には「売上」テーブルにはないD支店や「来客数」テーブルにはないD支店も集計対象となります。
また、このような方法で中間テーブルを作成しておくと、「売上」テーブルや「来客数」テーブルにデータが追加となり、支店名が増えた場合も自動的に集計対象となります。
まとめ
今回は多対多のリレーションシップ設定する2つの方法を扱いました。1つは多対多カーディナリティの設定をする方法で設定自体は簡単ですが、キー列を設定した方のテーブルに存在するキー列の値しか集計対象にならないことに注意が必要です。一方で、中間テーブルを介する方法では初回は少し手間がかかりますが、その後、データが追加されても自動反映されます。前者のような成約がない分、慣れないうちは中間テーブルを使った方法の方が確わかりやすく確実かもしれませんね。
コメント