タグ別アーカイブ: 双方向

リレーションのツボ~2つのテーブルを組み合わせつつフィルターする~

【フィルターがどうもおかしい?と思ったらまずは今回の内容を疑ってみましょう!】

今回の記事では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数が多いのが分かっていれば問題ないのでは?」と思った方もいらっしゃると思います

確かにその通りなのですが、王道の方法であれば「ミスに気づきやすい」なども含めて総合的に確実性が担保されるので、王道の方法を実践するのがベストです!

最後に、

今回の記事は前回の内容:クロスフィルターの方向を単一もしくは双方で調整とも踏まえてみて頂くと理解が深まると思います

ぜひ前回の記事も目を通してみてください

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

リレーションのツボ~クロスフィルターの方向を単一もしくは双方で調整

【クロスフィルターの方向を調整すると、リレーションの罠を回避することができます】

Power BIを始める時に壁に当たりやすいのが「リレーション」です

リレーションがスパゲティ状態になり、よくわからなくなったことがある人もいらっしゃるのではないでしょうか?

今回の記事ではこのスパゲティ状態を解読する、回避するヒントを「クロスフィルター」の観点で解説したいと思います

尚、当記事は理想のリレーションを作成する方法を解説しようとする意図ではなく、あくまでスパゲティ状態を解読、回避するヒントを「クロスフィルター」に絞って解説しようとしているということを予めご了承お願いします

ポイント

VLOOKUP関数はエクセル関数の中でも代表的な関数です

Power BIのリレーションも基本的には同じ内容です

ただ違う点が1点あります

それは影響範囲です

VLOOKUP関数を使用すると関連するのは2つの表のみです

VLOOKUP関数を使用した表とVLOOKUP関数が参照した表です

Power BIの場合は違います

例えば、次にょうなリレーションがあったとします

上の画像では「店名」と「来客数」はつながっていません

ところが、店名から作成したスライサーを動かすと来客数のマトリックス表も動きます

ここでもう一度、リレーションを確認してみましょう

「店名」と「店長」間は双方向でつながっています

店名から店長に影響を与えることもできるし、店長側から店名に影響を与えることができます

つまり、「店名⇒店長」の関係は存在します

更に「店長」と「来客数」の関係を見てみましょう

「店長」と「来客数」は単一の方向でつながっています

つまり「店長⇒来客数」の関係は存在します

ですので、「店名⇒店長⇒来客数」すなわち「店名来客数」の関係が存在するのです

ここがVLOOKUP関数と違う点です

間接的につながりが表の間で広がっていくようになっています

矛盾の排除

リレーションをいじっていると、思ったようにテーブル(表)の間でリレーションが作成できないケースがあります

それはポイントで解説した「影響の拡大」により矛盾が生じている可能性あります

前述のリレーションを次のように変えてみましょう

「店名」と「店長」間のリレーションを削除し「店名」と「来客数」間でリレーションを作成しました

こうなると、店名と店長のスライサー間ではシンクロが発生しません

ここで、店番と店長間でリレーションを作成しようとすると「破線」になりリレーションが作成できません

これがリレーションの矛盾です

店番と店長間でリレーションができると、来客数へのパス/通り道が2つ存在してしまうからです

ではどうするか?

店名と来客数間のリレーションを削除し、ポイントで解説した内容に戻すことももちろんできます

次の内容では、「店名」と「来客数」のリレーションを残したままで「店名」と「店長」間をリレーションしたいと思います

単一⇒双方向

今、店長と来客数間は単一の方向でクロスフィルターが行われています

方向は「店長⇒来客数」です

こちらを双方向にします

すると来客数を通じて「店番⇒店長」間のリレーションが間接的に成立します

これで2つのスライサーもシンクロします

<まとめ>

今回はリレーションを使用していて陥りやすい箇所を、クロスフィルターの観点で回避する方法を解説しました

エクセルワークシート関数のVLOOKUP関数を使用するのと違い、Power BIでは影響箇所が間接的に飛び火していくのも大きなポイントです

逆に飛び火を利用できるようになると、Power BIを使いやすくなります

そうはいっても、まだまだリレーションの箇所は様々なポイントがまだまだあります

今後、また別な機会で「多対多」のリレーションなども含めて解説していきたいと思います

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ