【初心者向け】Power BI カーディナリティとクロスフィルターの方向とは?

Power BIで複数のテーブルをつなげて使うとき、「リレーションシップ」の設定で見かける
「カーディナリティ」「クロスフィルターの方向」
最初は難しく感じるかもしれませんが、一度わかるとデータモデル作成がぐっとラクになります

カーディナリティとは?

カーディナリティ(Cardinality)とは、2つのテーブルをリレーションシップでつなぐときの「値の対応関係(数の関係)」のことです。

1対多(1:*)

主テーブルの1行が従テーブルの複数行に対応する場合で主キーが一意、従テーブルに複数の値があるケースです。Power BI のモデルの基本です。

例>顧客テーブル(1)→ 売上テーブル(多)

1 対 1(1:1)

主テーブルの1行に対して従テーブルも1行だけ存在する場合で両方のテーブルで対応するキーが一意になります。

例>社員マスタと社員給料明細

※Power BI ではモデルをシンプルに作成することを推奨するので、1対1になるケースは二つのテーブルをマージして1つのテーブルにすることをお勧めします。

多対多(*:*)

両方のテーブルに同じ値が複数回登場する関係です。

  • 一方のキーが一意ではない
  • 両方のテーブルで重複がある

例>製品テーブルとカテゴリテーブル

※Power BI では多対多は下記の理由でおすすめしないので、例外時にのみ使用しください

  • 集計が不正確な結果になる
  • フィルターがうまく効かない
  • DAXがややこしくなる
  • パフォーマンスが悪化する
  • モデル構造が複雑になる

多対多になる場合には、データが重複しているかを確認することと、多対多が必要な場合には中間テーブルを作成して分離してください。

まとめ:カーディナリティは「1対多」がおすすめ

カーディナリティ説明お勧め度
1 対 多(1:*)主テーブルに一意の値、
従テーブルに複数の値
顧客テーブル(1)⇔ 売上テーブル(多)
1 対 1(1:1)両方の列に一意の値社員基本情報と詳細情報
多 対 多(*:*)両方のテーブルに重複があるタグと投稿、カテゴリと製品など×

カーディナリティはなるべく「1対多」になるようにリレーションシップを設定しましょう


クロスフィルターの方向とは

テーブル間のフィルター(条件)が、どっちの方向に効くかを決める設定です。

スライサーや他のビジュアルで絞り込みをしたとき、その絞り込みがどこまで伝わるかに関係しています。

単一

一方のテーブルから他方にしかフィルターが流れない設定で、Power BI では基本設定になります。

カーディナリティが「1対多」の場合、1の主テーブルから多の従テーブルをフィルターします。

例>顧客テーブル → 売上テーブル

スライサーが「顧客テーブルの顧客ID」、テーブルが「売上テーブル」の場合、スライサーで選択して顧客IDで絞られる

スライサーが「売上テーブルの顧客ID」、テーブルが「顧客テーブル」の場合、スライサーで選択した顧客IDに絞られない

このように単一の設定により、フィルターされる向きがきまっているので、Power BI では基本的にスライサーを作成するときには、主テーブルの値を使用して、集計値などが表示されるメインビジュアルには従テーブルの値を使用してください。


双方向

主⇔従の両方にフィルターが流れる状態の設定で、フィルター向きもどちらも可能です。

クロスフィルターが双方向の場合、リレーションシップを設定されている両方のテーブルはどちらでもフィルターします。

例>顧客テーブル → 売上テーブル

スライサーが「顧客テーブルの顧客ID」、テーブルが「売上テーブル」の場合、スライサーで選択して顧客IDで絞られる

例>売上テーブル → 顧客テーブル

スライサーが「売上テーブルの顧客ID」、テーブルが「顧客テーブル」の場合、スライサーで選択した顧客IDに絞られる

双方向は複数のテーブルをまたいで分析する場合や、スライサーでつなぎたいときに使いますが、間違って使用すると空白が出たり、集計ミスが起きやすいです。

■双方向の注意点

問題説明
空白データが出る不要なテーブルにまでフィルターが流れてしまう
DAXで想定外の結果になる合計や件数がずれて見えることも
モデルが重くなる処理コストが増えて遅くなることもある

まとめ:クロスフィルターの方向は「単一」がおすすめ

クロスフィルターは基本的に「単一」に設定することをお勧めです。

双方向に設定するときにはフィルターが逆流して想定外の結果に注意します。

コメント

タイトルとURLをコピーしました