今回は計算列で一つ前の値と比べ、結果によって表示する値を決める方法を紹介したいと思います。
他にもたくさんやり方があるかと思います。その中の一つとして参考になればいいなと思います。日々勉強中なので、もっといい方法があれば教えてください!!
簡単なステップとしては以下の通りです。
- 表を取り込む
- 新しい計算列に行番号を入れる(上から1、一行下に行くにつれて1を追加)
- 行番号を使って一行前の行の値を返すDAXを書く
- 一行前の値と現在の行の値を比べるIF構文を書く
目次
使用例 – シナリオ
こんなのいつ使うの?と思った方もいると思います。そんな時用にこのテクニックが役に立つシナリオを紹介したいと思います。
それは。。。
テストの日付と点数がある表で、前の月と比べて点数がどう変化したのかをすぐに分かるようにしたい!
これに尽きますね笑
用意するもの
まず用意するのは上の画像のような簡単な表。内容は以下の通り。
表の内容
- 1列目:日付(今回は1ヶ月ごと)
- 2列目:その月のテストの点数
計算列で一行前の値を参照する方法
簡単なステップとしては以下の通りです。
- 表を取り込む
- 新しい計算列に行番号を入れる(上から1、一行下に行くにつれて1を追加)
- 行番号を使って一個前の行の値をとるDAXを書く
- 一個の値と現在の行の値を比べるIF構文を書く
表はもう取り込んであるのでステップ2からやっていきます。
新しい計算列に行番号を入れる
行番号を入れる理由
は?と思われた方のために補足します。ここでは各行に番号を振っていきます。とただ単に一番上を1として各行にユニークな番号を付けていくのです。
理由としては、2行目の処理をする時に1行目と比べたいから。(前の行)と言う概念がないので、こうして各行に番号をつけて後にn行目を参照してとDAXに言えるようにするのです。
※Power Queryを使ってINDEX列を追加する事もできます。今回この方法で紹介する理由は計算テーブルではPower Queryを使ってINDEXは追加出来ません。なのでこれから紹介する方法でINDEX列(行番号)を入れていきます。
行番号が入る計算列を作る
「新しい列」をクリックし、新しい列を作り名前をつけてください。
使うDAX:”RANKX” (リンクは Microsoftのリファレンス)
こちらのDAXは参照される列の値に応じてランク付けをすると言うもの。降べきの順,昇べき順に並べることができます。
必要なDAXは以下の通り
行番号 =
RANKX(
'Test scores - Sample File','Test scores - Sample File'[日付],,ASC
)
赤色のテーブルの緑色の列を昇べき順でランク付けしてと言うDAXになっています。青い部分を「DSC」に変更するとランク付けが逆の順番になります。
注意すべき点は:列に同様の値があると失敗する場合があります。
行番号を使って一行前の行の値を返すDAXを書く
このでは、先ほど作った行番号を使って一つ前の値を値を返す方法を紹介します。
一行前の行番号の見つけ方
シンプルかもしれませんが、一行前の行番号は、現在の行番号-1で求められます。
今回のシナリオに当てると、一行前は以下の通りで示せます。
'Test scores - Sample File'[行番号]-1
これで一行前の値がわかりました。これはすぐあとで使います。
一行前の値の見つけ方
使うDAX:”LOOKUPVALUE” (リンクは Microsoftのリファレンス)
search_columnName および search_value で指定されたすべての条件を満たす、行の result_columnName の値を返します。(MS) Excelで言うVLOOKUPですが、Power BiのDAXではLOOKUPVALUEと言う名前です。LOOKUPVALUEの詳しい使い方は後ほど紹介します!
必要な DAXは以下の通りです。
LOOKUPVALUE(
'Test scores - Sample File'[点数],'Test scores - Sample File'[行番号],'Test scores - Sample File'[行番号]-1
)
説明:緑色の列から青色の行番号を探し、同じ行にある赤い列の点数を渡す。と言うDAXになっています。
適用してみると、「結果」列には、一つ前の値がしっかりと返されているのが確認できます。
一行前の値と現在行の値を比べるIF構文
これで一つ前の値を返すDAXができました。今度はこれを使ってIF文と組み合わせ、比べた結果に合わせて出力したいと思います。
上の画像のように、IF文に先ほどのLOOKUPVALUE(一行前の値を返す)構文を当てはめてみました。完成したIF文は以下の通り
IF(
'Test scores - Sample File'[点数]>
LOOKUPVALUE(
'Test scores - Sample File'[点数],'Test scores - Sample File'[行番号], 'Test scores - Sample File'[点数]-1
)
,"改善","悪化"
)
条件は以下の通りです。
もしこの行の点数が一行前の点数より大きければ「改善」、小さければ「悪化」と返す。
ただ少しわかりづらいので少しまとめると…
どちらとも前の行の値と比べて改善か悪化を返しています。ただ結果列の一番上の行は比べるものがないはずです。なので『もし比べる物がなかったら空白を返して』と言うIF構文を付け加えてみるのもいいかもしれません。
まとめ
ステップとしては以下の通りです。
- 表を取り込む
- 新しい計算列に行番号を入れる(上から1、一行下に行くにつれて1を追加)
- 行番号を使って一行前の行の値を返すDAXを書く
- 一行前の値と現在の行の値を比べるIF構文を書く
準備が出来ていれば実質3ステップですね!ここまでみてくださってありがとうございました。
以上、「【Power BI Dax】計算列で一行前の値と現在の行の値を比べる方法」でした!
2件のフィードバック
[…] 【Power BI Dax】計算列で一行前の値と現在の行の値を比べる方法https://kazuworldtravel.com/power-bi-dax-comparing-to-the-previous-value/今回は計算列で一つ前の値と比べ、結果によって表示する値を決める […]
[…] 【Power BI DAX】初心者のためのFILTER関数の使い方https://kazuworldtravel.com/power-bi-dax-filter/今回はフィルターを通したテーブルを返してくれるFILTER関数を初心者目線で紹介したいと思います。難易度の高いDAX式を作っていくほど、メジャーや計算列を作っていくほど避けては通れない関数です。避けては通れないと言っても、自分にとって壁になるのではなく、…【Power BI Dax】計算列で一行前の値と現在の行の値を比べる方法https://kazuworl… […]