
複合主キーでリレーションシップを設定する方法
こんにちはMJです!
データモデリングを行っていると、テーブル同士を単一キーだけで関連付けるのが難しいケースがよくあります。
例えば次のように、2つ以上の列を組み合わせて初めて一意になる場合です。
- 「顧客ID + 注文日」
- 「商品コード + サイズ」
- 「店舗コード + POS番号」
しかし、Power BIのリレーションシップ設定UIでは単一列しか指定できず、複合キーを直接設定することはできません。

とはいえ、モデル化ができないわけではありません。複数列を連結した新しいキー列を作成し、実質的に複合主キーとして機能させる方法があります。
今回では、Power BIで複合主キーを実装する方法と注意点もまとめてご紹介します。
サンプルデータ
今回使うサンプルデータを紹介します。
ベンダーと販売場所ごとに最大割引率のルールが設定されており、実際の販売データがその上限を超えていないか確認する
シナリオを例として説明します。
Sales_Transaction(販売実績)
| Transaction_ID | Vendor_ID | Sales_Channel | Item_Amount | Discount_Rate |
|---|---|---|---|---|
| T001 | V-NIKE | オンライン | 100000 | 0.18 |
| T002 | V-NIKE | 店舗 | 80000 | 0.22 |
| T003 | V-ADID | オンライン | 50000 | 0.20 |
| T004 | V-ADID | 店舗 | 120000 | 0.09 |
| T005 | V-PUMA | アウトレット | 60000 | 0.35 |
| T006 | V-NIKE | オンライン | 20000 | 0.21 |
| T007 | V-ADID | オンライン | 30000 | 0.26 |
Discount_Policy(最大割引ポリシー)
| Vendor_ID | Sales_Channel | Max_Discount_Limit |
|---|---|---|
| V-NIKE | オンライン | 0.20 |
| V-NIKE | 店舗 | 0.15 |
| V-ADID | オンライン | 0.25 |
| V-ADID | 店舗 | 0.10 |
| V-PUMA | アウトレット | 0.30 |
これら2つのテーブルは、Vendor_ID だけではリレーションが成立できません。
Vendor_ID + Sales_Channel が両方一致した時にのみ正しく対応付けられます。
複合キーの作り方① Power Queryで列を追加
まず、Power Queryエディターを開きます。
方法A:列からの列(選択範囲から)
以下の画像のように「列の追加」→「列からの列」→「選択範囲から」をクリックします。

「Vendor_ID」「Sales_Channel」を連結した新しい列を作成するため、以下の画像のように列名の右にあるチェックボックスをチェックします。
次にサンプル値入力欄には同じ行にあるデータをハイフンで連結して入力します。
そうしましたら、PowerQueryの式が作成され、2行目以降は自動的に値が作成されます。

カラム名を変更し、「OK」を選択して保存します。

「Vendor_ID」「Sales_Channel」の値が連結された「Composite Key」列が作成できました。

方法B:カスタム列
以下の画像のように「カスタム列」をクリックし、表示されたウィンドウに「新しい列名」と「カスタム列の式」を入力します。

結果は方法Aと同じく列が生成されます。
方法C:列のマージ
以下の画像のようにマージする列をCtrlを押しながらクリックして選択します。
次に列名のところを右クリックし、列のマージを選択します。

そうしましたら、以下のウィンドウがでます。
マージする時の区切り記号設定や、新しい列名を設定できます。
区切り文字としては「コロン、コンマ、等号、セミコロン、スペース、タブ」が選択できました。

しかし、今回は”-”ハイフンを入れたいので、「--カスタム--」を選択し、"-"を入力しました。

設定が終わったら、「OK」をクリックします。
方法A・Bと異なり、マージ対象として選択した「Vendor_ID」「Sales_Channel」列は削除されます。

ですので、既存の列がスライサーや視覚化フィールドに使う場合、「方法A、方法B」で新しい列を作成してください。
複合キーの作り方② DAXで列を追加
Power BI Desktopの「レポートビュー、テーブルビュー、モデルビュー」関係なく、右のデータウィンドウで新しい列を追加したいテーブルをクリックすると、上段のメニューから「新しい列」機能が出ますので、クリックします。

以下の画像のように式を入力して新しい列が作成できます。

しかし、PowerQueryで作成した列とは違ってDAXで作成した列は列名の左にアイコンがつけています。
これは、Power Queryで作成した列と DAX で作成した列が異なる種類の列であることを示しています。
二つを比較した記事もご参考にしてください。
リレーションシップの設定
「モデルビュー」で先ほど両方のテーブルに作った「Composite Key」をドラッグし、他のテーブルの「Composite Key」にドロップするか、上段にある「リレーションシップの管理」機能でリレーションシップを設定します。

以下の画像のように設定し、「保存」を選択します。

そうすると、各テーブルの2つの列が1つのキーとしてリレーションシップ設定ができます。

これで正しくマッチしたデータが表示され、どのベンダーと販売場所が最大割引率を超えたのか確認できました。

まとめ
複合主キー用に新しい列を追加すると、データモデルの容量が増えるというデメリットがあります。

リレーションの目的だけで参照予定がない既存の列であれば、削除してモデルサイズを縮小することをおすすめします。
運営会社
