【このコンテキスト遷移の理解がDAX自体の理解の近道です】
DAXを使用していて「何故こうなるの?」ということに出会うことがあります
「何故こうなるの?」の不思議の一つが「コンテキスト遷移」です
早速、事例で見てみましょう

上の画像の2つの列は「大阪」で値が2300と1200と言う風に違いがあります
実際にメジャーの中身を見ると些細な違いしかありません
・MAXX_NoCal

MAXX_NoCal = MAXX(‘担当者’,SUMX(‘売上’,’売上'[金額]))
・MAXX_withCal

MAXX_withCal = MAXX(‘担当者’,CALCULATE(SUMX(‘売上’,’売上'[金額])))
MAXXの第二引数にCALCULATE関数があるかないかだけです
ところが、このCALCULATE関数のあるなしがとても大きいのです
CALCULATE関数があるメジャーは2300⇒1200となり、何らかの形でデータの絞り込み(フィルター)が行われています
今回の記事ではこの絞り込みが有効になる「コンテキスト遷移」の仕組みについて解説していきます
目次
DAXで計算したいこと
今回は2つのテーブルを使用します

1つ目は担当者のテーブル、2つ目は売上テーブルです
売上テーブルは同一担当者が複数登場しています

DAXを使用して、この2つのテーブルを組み合わせて、東京と大阪で最大の売上をあげた担当者の金額を計算します

MAX関数での計算
「東京と大阪で最大の売上・・・」というように「最大」というキーワードが出てくるので、MAX関数を使用するのでは・と思った読者の方も多いと思います
では早速、MAX関数で計算してみましょう

MAX = MAX(‘売上'[金額])
そうすると上の画像のように、思ったよりも小さい金額算出されます
これはそもそも集計の単位が違っています

ですので、まずは担当者テーブルで新しい列を作成し、担当者別に売上金額を算出してみます

新しい列で担当者別の売上を算出した上で、MAX関数を使用してみます

これで意図とした通りの結果が出ました
ポイントは新しい列を作成する時、CALCULATE関数を使用していることです

仮に、上の画像のCALCULATE関数を取り除いたらどうなるでしょうか?

全ての行の合計が算出されてしまいます
つまり、CALCULATE関数を使うことで遷移(全ての行⇒行別)が起こっているのです
MAXX関数/行評価
上のMAX関数の事例ではメジャーを作成するまえに、新しい列を作成しました
今度はMAXX関数を使用して、直接メジャーで担当者ごとの最高金額を大阪と東京で算出したいと思います
MAXX関数では単純に最大値を算出するのではなく、行別に式を評価した上で最大値を算出します
他の言葉で言い換えると、条件に合う「行の中」で最大値を算出してくれます
ちなみに、大阪と東京の合計金額は次の画像のようになっています

では、話を戻してMAXX関数を実際に使用して大阪と東京の担当者別の最大値を算出してみましょう

通常の合計金額と同じ結果になってしまっています
つまり、大阪もしくは東京という「行別」だけが考慮された計算金額になってしまっています
MAXX関数の第一引数はMAXX(’担当者’となっているのに「担当者の行別」は考慮されていません
これは、前に例に挙げた下の画像と同じ現象が起こっています

この時はCALCULATE関数を使用して「行別への遷移」を起こしました
実は、今回も同じようにCALCULATE関数を使用すれば正しく算出されます

CALCULATE関数を使用することで、今回もMAXX関数内で「行別への遷移」を起こしているわけです
これで、DAXは何故こうなるのか?の謎が一つが解けたと思います
メジャー使用による行評価
番外編として、次の事例も紹介したいと思います

上の画像の一番右の式はCALCULATE関数を使用していません
MAXX_NoCal_withMEASURE = MAXX(‘担当者’,[売上合計])
その代わり、第二引数に[売上合計]というメジャーを使用しています

ですが、CALCULATE関数を使用したのと同じ結果がでています

これはメジャーを使うこと自体で、CALCULATE関数を使用するのと同等の効果があることを意味します
たとえメジャーの中身と同じ内容を関数の引数で使用しても、違う結果が出てしまうのはこの為です
<まとめ>
今回はCALCULATE関数を使用して、行別の評価を関数内で受け渡す「コンテキスト遷移」について解説しました
この概念を理解すると、格段にDAXの活用の幅が広がります
ぜひマスターしておきましょう!!
コメントを残す