DAX解説 SUMとSUMXの違い【エクセル パワーピボット】【Excel PowerPivot】
エクセルのパワーピボットやPowerBIなどで使うDAX関数には、値を合計するお馴染みの関数である『SUM』とは別に、似た名前の『SUMX』という関数があります。
こちらの記事では、そのSUMとSUMXの違いについて解説します。
以下の動画でも同じ内容を解説しています。
記事をご購入いただくと、記事の最下部から本記事と動画の解説で実際に使用しているExcelファイルをダウンロードすることができます。
=== ストアカで開催中のオンライン講座 ===
===============================
SUMは『列』を合計する
データモデルに3つのテーブルがあり、以下のようにリレーションが設定されています。
『販売データ』テーブルの『販売数量』列の値をメジャーを使って合計したい場合、
列の値の合計なので、もちろんDAX関数のSUMを使います。
@販売数量 := SUM( '販売データ'[販売数量] )
では、『販売数量』に『商品コード』ごとの『単価』をかけて、『売上高』の値を算出し、その『売上高』の合計をメジャーで求めたい場合はどうするかといいますと、
こんな感じで、RELATED関数を使って『商品マスタ』テーブルの『単価』もってきて、計算列として『販売データ』テーブルに追加します。
『単価』の計算列 : = RELATED( '商品マスタ'[単価] )
『売上高』の計算列はRELATED関数でもってきた『単価』に『販売数量』をかけます。
『売上高』の計算列 : = '販売データ'[販売数量] * '販売データ'[単価]
あとは計算列として作成した『売上高』の列の値をSUMを使って合計します。
@売上高 := SUM( '販売データ'[売上高] )
ここで、ちょっと考えてみます。
このメジャーのSUMの中で合計している『'販売データ'[売上高]』の数式は
と分解できます。
なら、『売上高』を計算するための数式を、SUMのメジャーの中に埋め込んでしまえば、わざわざ『販売データ』テーブルに余計な計算列を追加しなくていいんじゃないか?
つまり、
@売上高 := SUM( '販売データ'[売上高] )
を
@売上高 := SUM( '販売データ'[販売数量] * RELATED( '商品マスタ'[単価] ) )
にしてしまえないか?というわけですね。
結論から言いますと、このメジャーはエラーで値が算出されません。
@売上高 := SUM( '販売データ'[販売数量] * RELATED( '商品マスタ'[単価] ) )
理由はエラーメッセージに書いてあるとおりで、
SUMの引数として使えるのは列だけだからです。
このメジャーだと、SUMの引数として設定している赤線の部分は列ではありませんので、SUMに関しては、こういった使い方をするとエラーになってしまいます。
SUMXは『計算式』を合計できる
ではSUMXというDAX関数を使うと、どうなるか?
@売上高 :=
SUMX( '販売データ' , '販売データ'[販売数量] * RELATED( '商品マスタ'[単価] ) )
実は、SUMXであれば、こんな感じで数式を引数で使うことができます。
つまり、『販売データ』のテーブルに『単価』『売上高』という計算列を追加する必要がなくなります。
SUMXには以下のような説明文が表示されます。
テーブルの行ごとに評価される式の合計値を返します。
分かりにくいですね。
少なくとも、私はよく理解できませんでした。
SUMXの計算ロジックは、大体こんなイメージです。
文書にすると、
第1引数で指定したテーブルの1行1行で
第2引数で指定した数式を計算し
各行で計算された第2引数の結果の数値を合計する。
となります。
SUMの場合は列しか引数に指定できませんが、SUMXの場合は計算式を引数にできるということですね。
ちなみに、最初にSUMで作成したメジャーをSUMXで表現すると
@売上高SUM := SUM( '販売データ'[売上高] )
@売上高SUMX:= SUMX( '販売データ' , '販売データ'[売上高] )
となり、この2つのメジャーは同じ値が算出されます。
記事と動画で使用しているExcelファイル
よければサポートしていただけると嬉しいです😀 有用な記事や動画を制作していけるように頑張ります❗️