Power BI -列の中の各行の値を列全体を見ながら判定する ("VAR"の使い方例)

サンプルデータ

画像1

上記のようなお買い物履歴のテーブルがあったとします。

このテーブルで、例えば、
11月6日に買った購入点数は何個か?」を計算したいとき、
DAXではどのように書けばいいのか、迷うと思います。
(ちなみに答えは、マグロとねぎを買っているので、「2個」になります)

一応、計算式をイメージすると、
「11月6日」という調べたい特定の日付
その日付が掲載されている「日付」列
数式の中に入れないと計算できないだろうというところまでは
分かると思います。


VARをDAX式の外に吐き出すと特定行だけ数式の中で参照することになる

先に結論から書くと、記載するべき数式は以下の通りです。

同日購入品目数 =
VAR  CurrentRow = 'お買い物履歴'[日付]
RETURN
COUNTROWS ( 
             FILTER (
                  'お買い物履歴' ,
                  CurrentRow = 'お買い物履歴'[日付]   
             )
)

カスタム列の追加で上記の式を入れると、このように結果がでます。

画像3

この式は一見すると、最初のVARの後に 
CurrentRow = 'お買い物履歴'[日付] 
と変数を定義しているので、
その後、RETURNに記載したDAX式の中で、 
CurrentRow = 'お買い物履歴'[日付] 
と見比べると、まるで 

'お買い物履歴'[日付] = 'お買い物履歴'[日付]

と書いているように見えます。

でも、そうではありません。
式全体の中では、そのように処理されていません。

VARで特定列を外だしする意味

VARでDAX式の中から(つまり、RETURNよりも上に)、
特定の列を外だしすると、
VARで定義された列は、
その後のRETURN以下で記載している式で
テーブルの各行を処理していく際に、
その処理中の行にある、VARで定義した列の値のみを指定することになります。

イメージで説明するとこんな感じです。

画像2

上の図のように、
RETURN以下の式で、FILTER関数が特定の条件(CurrentRow = 'お買い物履歴'[日付])で、指定したテーブル('お買い物履歴')に含まれる1行1行をフィルタリング処理していく際に、
処理対象となっているVARで先に定義した列は、処理中の行だけを指し、RETURN以下で指定した列は、列全体を意味しているということです。


これは、エクセルのテーブルにおいては、「@」を付けることと同義であり、また、M言語においては、「_」を付けることと同義になります。
(このあたりは、また時間があれば書きます)

おまけ DAX関数で同じ結果を得たい場合

EARLIER関数を使います。
式の書き方は、以下の通りです。

同日購入品目数 =
  COUNTROWS(
   FILTER(
    'お買い物履歴',
    'お買い物履歴'[日付]=EARLIER('お買い物履歴'[日付])
   )
  )

このように同じ結果が得られました。

画像4

以上になります。

いいなと思ったら応援しよう!