【フィルターがどうもおかしい?と思ったらまずは今回の内容を疑ってみましょう!】
今回の記事では2つに分かれているテーブルを、リレーションにより一緒のマトリックスで使用します

上の画像の「発注数の合計」「納品数の合計」はそれぞれ別のテーブルのものです
そして、別のテーブルの内容がそれぞれ同じく「商品ID」にてフィルターされています
ちなみにここで言うフィルターとはエクセルのフィルター機能とは似て若干異なります

エクセルのフィルター機能は主に絞り込むために使用します
今回の記事のフィルターは「絞り込む」だけでなく「区分」や「選択」の意味がありますので、その点はご留意ください
実はこの「別テーブル共存」「同フィルター」の状態を作るのがとても重要なことなのです
どう作るかについては王道があります
1.参照マスタを作成する
2.それぞれのテーブルとの間で参照マスタとのリレーションを「1対多」「単一方向」で作成する
3.参照マスタの内容でフィルターする
この3つが王道です
何故ここで王道という表現を使うのか?
これは他にもリレーションやフィルタをする方法があるからです
但し、他の方法だと不正確だったり、曖昧さが残ります
この不正確になったり、あいまいさが何故発生するのかを理解し、Power BIのフィルターがどういうものなのかを考察するのが今回の記事の目的です
では、ここから王道も含めて他の方法を取った場合を実際に見ていきたいと思います
目次
今回使用するデータ
発注テーブル
商品ID、発注数、発注日の3列から構成されます

商品IDは1~10まであります
発注日は1つの商品IDに対して複数あります

ちなみに発注数の合計は190になります
納品テーブル
商品ID、納品数、納品日の3列から構成されます

商品IDは発注されてまだ全く納品されてないものもあるので、1~7までになります
納品日は1つの商品IDに対して複数あります

発注された10種類のIDの商品の中にはまだ全く納品されていない商品がある、というのが後々大きなポイントになります
ちなみに納品数の合計は80になります
商品IDマスタ
全部で10行あります


発注テーブルと納品テーブルの商品ID数は以下のようになります
発注テーブル:10 > 納品テーブル:7
ですので商品IDマスタの行数は、両テーブルを漏れなくダブりなく網羅した10となります
王道の場合
王道の場合のリレーションは次のようになります

「発注テーブルと商品IDマスタ」そして「納品テーブルと商品IDマスタ」それぞれの間に「1対多」のリレーションがあります
何故、1対多の関係になるかというと、前述のように1商品IDに対して発注日や納品日が複数に跨るからです
(注)ここでの*は多の意味になります

そしてそれぞれのリレーションは「単一方向」で作成します

以上が王道のリレーションのパターンです
マスタでフィルター
ではビジュアルはどうなるかを次に説明します

最大のポイントは商品IDマスタでフィルタすることです

マスタ以外でフィルター
では、次のように発注テーブルの商品IDでフィルターするとどうなるかを見てみましょう?

発注テーブルから取得する「発注数」は問題ないですが、納品テーブルから取得する「納品数」の方は全ての行が合計数になってしまい、商品ID別のフィルターが効いていません

理由はフィルタの方向が「商品IDマスタ」⇒「発注、納品テーブル」の方向の「単一」であるためです
その為、発注テーブルのフィルターが商品IDマスタを通じて納品テーブルまで波及していないからです

更に、次の画像のように納品テーブルの商品IDでフィルターしてみましょう!

こちらも発注数が合計になってしまいます
加えて、商品IDの8以降が欠けてしまいます
ですので、あくまでフィルターは参照マスタの内容で行うのが確実なのです
単一ではなく双方向でフィルターした場合
前述の王道ではクロスフィルターを単一で行っていました
では、クロスフィルターを双方向に変えてみたいと思います

この場合は実は、前述はうまく行かなかった発注テーブルからのフィルターが正しく行えます

何故正しくフィルターが行えるか?他の言葉で言い換えると何故、発注テーブルの内容で正しく納品テーブルの内容をフィルターが行えるかというと、フィルターが波及するからです

フィルターが波及する点は、納品テーブルの内容でフィルターした時も同様です

但し、この場合は結果が曖昧になります

商品IDが納品テーブルの内容の7迄になるからです
ですので、リレーションを双方向にて2つのテーブルをつなぐ場合は「曖昧」な結果になる可能性があるということになります
多対多
最後に、商品IDマスタを介さずに多対多でリレーションする場合を見てみましょう

ここで、本題に入る前に多対多の関係について詳細に見ておきましょう

上の画像で1が上下のテーブルで複数出現します
前回の商品IDマスタと発注、納品テーブルの関係では1⇒「1、1、・・・」となっていました
ところが、今回の多対多の関係では「1、1」⇔「1、1」ということになります
以下の画像のように、参照マスタに参照する値が複数あるのとは違い、元々複数の値があるテーブルどうしなのでそんなに問題が無いかのように感じます

実はこの場合も曖昧な結果になります
下の画像は「発注テーブル」の商品IDにてフィルタしたケースです

この場合は確かに問題がありません
今度は納品テーブルにてフィルタしてみます

この場合、納品テーブルの商品ID数までしか表示されないので曖昧な結果になります
ですので、やはり王道の方法が一番確実なのです!
<まとめ>
今回は参照マスタを使用して、2つのテーブルを連携する「王道」について解説しました
記事の途中で「2つのテーブルの内、どちらかの方がID数が多いのが分かっていれば問題ないのでは?」と思った方もいらっしゃると思います
確かにその通りなのですが、王道の方法であれば「ミスに気づきやすい」なども含めて総合的に確実性が担保されるので、王道の方法を実践するのがベストです!
最後に、
今回の記事は前回の内容:クロスフィルターの方向を単一もしくは双方で調整とも踏まえてみて頂くと理解が深まると思います
ぜひ前回の記事も目を通してみてください
コメントを残す