バンプチャート(順位推移グラフ)ー RANKX

技術的なポイント
DAXで順位を求めるにはRANKX関数を使用します。
RANKX function (DAX) - DAX | Microsoft Docs
第一引数:テーブル ここに順位を求める対象のテーブルを指定します。(今回は商品テーブル)
第二引数:計算式 ここに順位を比較するための計算式(今回は「売上合計」)を指定します。
第一引数のテーブル指定時にALLまたはALLSELECTEDを付けるのがポイントです。
実践
ならべるステップ
まず、挿入→ピボットテーブルから、このブックのデータ モデルを使用するを選んでピボットテーブルを作成します。
ピボットテーブルのフィールドは以下のように、行に商品名、値に売上合計を配置します。

この段階では商品名と売上合計しか並んでいません。

かぞえるステップ
これからRANKX関数でメジャーを作成しますが、敢えて誤った例を紹介しながらポイントを押さえていきます。
商品売上順位メジャーの作成
さっそくメジャーを作成します。
商品テーブル→右クリック→メジャーの追加を選びます。

商品売上順位メジャーを以下のように作成します。

= RANKX('商品', [売上合計])
ところが、作成したメジャーをピボットテーブルに追加して順位を確認すると、すべて1です。

これはRANKXの第一引数、'商品' がピボットテーブルのセルのフィルターコンテキストの影響を受けているため、順位を比べる対象が1対1になっているからです。

したがって、ALL関数を使って第一引数 '商品'テーブルのフィルターを解除します。以下のように商品売上順位メジャーを修正してください。
= RANKX(ALL('商品'), [売上合計])
これで商品名全体の中での順位が出ました。(青枠は比較対象の全商品名、赤枠は順位を求める商品です。)


次にスライサーを追加します。
ピボットテーブルのフィールドから商品→商品カテゴリー→右クリック→スライサーとして追加を実行します。

さっそくスライサーを選択してみると、商品名は絞られたものの、順位が商品名全体での順位でスライサーを受けた順位になっていません。

スライサーの選択を反映するには、ALLSELECTED関数を使います。以下のように商品売上順位メジャーを修正してください。
= RANKX(ALLSELECTED('商品'), [売上合計])
これでスライサーの内容を反映した順位を表示することができました。

次に列に時間軸としてカレンダーテーブルの会計年度を追加します。

これで会計年度ごとの順位の推移が出ました。ここまで来たら売上合計メジャーはピボットテーブルから外します。なお、2019年度には売上実績データが無いためすべて1になっています。

えがくステップ
バンプチャート(順位推移グラフ)の作成
まずは空のピボットグラフを作ります。
何もないセルにカーソルを移動し、挿入→ピボットグラフ→ピボットグラフを選んでください。例によって、このブックのデータ モデルを使用するが選択されていることに注意してください。

ピボットグラフには以下のように設定します。
軸(分類項目): 会計年度
凡例(系列): 商品名
値: 商品売上順位

次にピボットグラフをすでに作成した商品カテゴリースライサーに結び付けます。
商品カテゴリースライサー→右クリック→レポートの接続を選択します。

先ほど作成したピボットグラフにチェックを入れ、OKを押します。

これでピボットグラフがスライサーで絞り込まれました。

次に、ピボットグラフをクリックし、デザイン→グラフの種類の変更→折れ線→折れ線を選択します。

これで折れ線グラフになりました。
次に、グラフの順位を反転させます。
折れ線グラフの縦軸の順位をダブルクリックし、表示された軸の書式設定で軸を反転するにチェックを入れます。

グラフを選択したまま、デザインメニューで以下のデザインを選択します。

これでだいぶ形になってきました。

しかし、2019年には売上実績が無いのにもかかわらずグラフが表示されているので、これを消します。以下のように商品売上順位メジャーを修正してください。
売上合計に値が入っている時のみ順位を表示し、値が入っていない場合はブランクにする条件を追加しました。
=
IF(
[売上合計],
RANKX(ALLSELECTED('商品'), [売上合計])
)
これで完成しました。

同様に支店名など、他のスライサーも追加すると便利でしょう。

以下は支店名で順位を作成した時のバンプチャートとメジャーの例です。

=
IF(
[売上合計],
RANKX(ALLSELECTED('支店'), [売上合計])
)