Power BI -イテレータ関数(SUMX, MINX, COUNTXなど)の概要と例#1
Power BI を使い始めの方がDAXを使ってメジャーを作成していくと、
ある時点で SUMX関数に遭遇し、躓きそうになる人が多いと思います。
僕もSUMX関数は(過去の記事で調べまくっている様子を見てもわかるように)鬼門でした笑
多分Excelユーザーにはなじみのない関数で、
PythonとかCとかでプログラミングをされてきた方にとっては、
「イテレータか」とすぐに理解できるのかもしれませんが、
僕もイテレータ(SUMX等)には、
かなり理解にてこずりました。
イテレータ関数とは
イテレータ関数は、「反復関数」と訳されますが、
ざっくりこんな特徴があります。
✓ 特定のテーブルの全ての行を列挙し、各行に対して(一行ずつ)、特定の式を評価する(←これを「反復処理」という)
✓ 全ての反復関数は、「テーブル」と「評価式」の2つの引数を必要とする
✓ 「テーブル」は参照先のテーブル(リレーションシップで関連付けられた計算対象数値を含まない別のテーブル)や、テーブルを返す数式を指定することが出来ます。
✓ 「評価式」は、スカラー値(数値)を返す評価式を入れる必要があります(文字列は評価対象にできません)。
✓ SUMやAVERAGEなど、単一列を評価対象とする関数は、イテレータ関数の「省略形」(簡易版)として位置づけられている
概要をまとめると、こんな感じです。
具体例で理解する
初見に近い方にとっては、
「反復って何?」という感覚がまだ残っていると思うので、
具体例を作成してみました。
具体例では次のシンプルなテーブルを使用します。
まず、1つ目の具体例は、
[Sales Amont]列の単純合計を算出するケースです。
次に、"単純合計"ではなく、
[Sales Amount]列の値に (1 - [% of License fee]) を乗じた値の合計を出したい場合の例です。
SUM関数では、一発で処理しきれなくなりました。
次に、平均値を算出する場合です。
なお、この例でいう「平均」とは、Salesテーブルの[Sales Amount]列の合計を、Salesテーブルの行数(3行)で除した値を意味しています。
次に、Salesテーブルの行ごとの平均ではなく、
Productごとの平均(つまり、[Sales Amount]列の合計を[Product]の種類数(2種類)で除した値)を求めたい場合の例です。
最後に、1つ上の具体例と大して差はないですが、
確認のため。
以上になります。
SUMX関数を直接理解しに行こうとするのではなく、
イテレータ関数の性質をまずは理解することで、
SUMXのみならず、他の'X'の付く関数の理解も進むと思います。
強調のため再度書きますが、
イテレータ関数は、
①指定したテーブルの行数回だけ、第2引数で指定した評価式を反復処理する
②①の反復計算が終わったら、そのイテレータ関数の特徴に応じた最終処理がされる(SUMXなら反復処理した各結果を合計し、AVERAGEXなら反復処理した各結果の合計を反復計算した数で除す)
というのがポイントとなります。
また、Power BIで躓きやすそうなところについて、
書いていきたいと思います。
でわ