Power BI -列の中の各行の値を列全体を見ながら判定する ("VAR"の使い方例)
サンプルデータ
上記のようなお買い物履歴のテーブルがあったとします。
このテーブルで、例えば、
「11月6日に買った購入点数は何個か?」を計算したいとき、
DAXではどのように書けばいいのか、迷うと思います。
(ちなみに答えは、マグロとねぎを買っているので、「2個」になります)
一応、計算式をイメージすると、
・「11月6日」という調べたい特定の日付と
・その日付が掲載されている「日付」列を
数式の中に入れないと計算できないだろうというところまでは
分かると思います。
VARをDAX式の外に吐き出すと特定行だけ数式の中で参照することになる
先に結論から書くと、記載するべき数式は以下の通りです。
同日購入品目数 =
VAR CurrentRow = 'お買い物履歴'[日付]
RETURN
COUNTROWS (
FILTER (
'お買い物履歴' ,
CurrentRow = 'お買い物履歴'[日付]
)
)
カスタム列の追加で上記の式を入れると、このように結果がでます。
この式は一見すると、最初のVARの後に
CurrentRow = 'お買い物履歴'[日付]
と変数を定義しているので、
その後、RETURNに記載したDAX式の中で、
CurrentRow = 'お買い物履歴'[日付]
と見比べると、まるで
'お買い物履歴'[日付] = 'お買い物履歴'[日付]
と書いているように見えます。
でも、そうではありません。
式全体の中では、そのように処理されていません。
VARで特定列を外だしする意味
VARでDAX式の中から(つまり、RETURNよりも上に)、
特定の列を外だしすると、
VARで定義された列は、
その後のRETURN以下で記載している式で
テーブルの各行を処理していく際に、
その処理中の行にある、VARで定義した列の値のみを指定することになります。
イメージで説明するとこんな感じです。
上の図のように、
RETURN以下の式で、FILTER関数が特定の条件(CurrentRow = 'お買い物履歴'[日付])で、指定したテーブル('お買い物履歴')に含まれる1行1行をフィルタリング処理していく際に、
処理対象となっているVARで先に定義した列は、処理中の行だけを指し、RETURN以下で指定した列は、列全体を意味しているということです。
これは、エクセルのテーブルにおいては、「@」を付けることと同義であり、また、M言語においては、「_」を付けることと同義になります。
(このあたりは、また時間があれば書きます)
おまけ DAX関数で同じ結果を得たい場合
EARLIER関数を使います。
式の書き方は、以下の通りです。
同日購入品目数 =
COUNTROWS(
FILTER(
'お買い物履歴',
'お買い物履歴'[日付]=EARLIER('お買い物履歴'[日付])
)
)
このように同じ結果が得られました。
以上になります。