この記事で分かること
売上履歴テーブルから売上高順に並び変えたスライサを作る方法をご紹介します。
実務では「売上が多い商品の傾向を素早く分析したい」というニーズがよくあります。
本記事では、RANKX関数を中心に、ALL関数・CALCULATE関数・SUM関数・ALLEXCEPT関数を組み合わせた実践的な方法を解説します。
順位付けでありがちな「全行が1位になる」「SkipとDenseの違いが分からない」といった課題も取り上げています。
同様の課題に悩んだ方の一助になれば幸いです。
課題|RANKX関数で売上順スライサを作る難しさ
次のケースを想定します。
- 商品ごとに売上履歴テーブルが存在する
- 同じ商品に重複行があるのは、店舗ごとに売上が存在するため(ここでは店舗列は省略)
- 「売上高順」と「商品名」を結合した文字列をスライサに表示したい
例えば売上1位が商品Bなら「1_B」と表示する
<売上履歴テーブル ’sales’>

<売上順スライサ(完成形)>

一見シンプルに見えるこの処理ですが、実はRANKX関数は引数が多く、どこに何を入れるか分かりにくいです。
さらに「Dense」と「Skip」の違いも理解していないと、意図しない並びになることがあります。
そこで今回は、RANKX関数を正しく使って売上高順のスライサを作る方法をステップ形式で解説します。
答え|ポイントはRANKX関数を使ったランク付け
以下のDAX式を新しい列として追加します。
列1_売上高順 =
RANKX(
ALLSELECTED(‘sales'[商品]),
CALCULATE(SUM(sales[売上]),
ALLEXCEPT(‘sales’, sales[商品])),
,
DESC,
Dense
)
次に、ランクと商品名を結合した列を作ります。
列2_商品ランク= [列1_売上高順] & “_” & [商品]
最後に、[列2_商品ランク] をスライサに設定し、昇順並びに変更すれば完成です。
解説|RANKX関数と関連関数の使い方
処理のポイントを簡潔にまとめます。
RANKX関数
順位を返す関数
第1引数 ALLSELECTED(‘sales'[商品])
⇒比較対象の範囲を指定
⇒今回は ALLSELECTED でも ALL でも同じ結果になります
第2引数 CALCULATE(SUM(sales[売上]), ALLEXCEPT(…))
⇒商品ごとの売上合計を計算
第2引数をSUM(sales[売上])だけにすると導入で述べたように、「全行が1位」になります。これは各行の1行だけでランク付けするためです。当然全行が1位になります。
CALCULATE関数
コンテキストを切り替えて計算するために使用
SUM関数
売上を合計する基本関数
ALLEXCEPT関数
指定した列(商品列)のみを残してフィルタを解除
商品単位で売上合計を求めたいときに必須
DenseとSkipの違い
Dense
⇒重複順位が出ても次の順位は連番
⇒今回のケースでは、順位は 1,2,3,3,4
Skip
⇒重複順位が出ると次の順位が飛ぶ
⇒今回のケースでは、順位は 1,2,3,3,5
スライサ用列の結合
[ランク] & “_” & [商品] の形にすることで、
スライサに「1_商品A」「2_商品B」と表示される
まとめ
- RANKX関数で売上順に商品をランク付けできる
- CALCULATE + SUM + ALLEXCEPTで商品ごとの売上合計を正しく算出できる
- Dense/Skipの違いを理解すると、期待通りの順位が得られる
- ランクと商品名を結合すれば、売上順スライサが作れる
売上上位の商品を素早く見つけることで、分析作業がぐっと効率化されます。
Power BI活用に、ぜひ役立てて下さい。(終わり)

コメント