【DAX】フィルターに左右されずに集計する

割合を出したいとき簡単そうでなんかうまくいかなかったので忘れないようにまとめました。使い分けがよくわからないのでメジャー作成時ALLと打つと出てくる「ALL」「ALLCROSSFILTERED」「ALLEXCEPT」「ALLNOBLANKROW」「ALLSELECTED」を使えるようにしたいなと思います。(やったら追加します)

風場 輝


適当に作ったダミーデータでPower BI練習中。バージョンによっては画面がかなり変わることもあるのであしからず。
この記事作成時のPower BI Desktopバージョンは「2.139.2054.0 64-bit (2025年1月)」

ぴ

この表を使おう

カテゴリごとの合計/カテゴリごとの割合を出す

ALL関数

カテゴリ(野菜・果物)ごとの商品名(いちご・キャベツetc.)の数量の割合を表示させるために、まずはカテゴリごとの数量の合計を出したいと思います。
カテゴリが野菜の商品名の横に、野菜のすべての数量合計値が表示されるという感じです。
これができれば、野菜・果物それぞれを分けた商品名の割合を出すことができます。

今回使っているデータの果物の数量の合計は1,599個、野菜の数量の合計は3,141個です。
メジャーを作ってこれらの数値が表示されればOKです。

も

野菜・果物ごとの合計を出して割ればいいんじゃないかな

まずは試しにCALCULATE関数でカテゴリを野菜だけに絞って合計を出してみましょう。

CALCULATE_野菜合計 = CALCULATE(SUM('2025_売上'[数量]),'2025_売上'[カテゴリ]="野菜")
も

野菜の数量の合計はちゃんと出ているみたい

ではこれを商品名も書いてある表に入れてみます。

も

えっなんか思ってたのと違う!野菜合計の列には全部3,141って入ってほしいのに商品名ごとの合計になってる

ぴ

表に入っているデータに合わせてフィルターがかかったみたいだね

フィルターがかからないようにするにはALL関数を使えばいいみたいなのでやってみたいと思います。

Power BI曰くALL関数とは「テーブルのすべての行、または列のすべての値を返します。適用されている可能性があるフィルターはすべて無視されます。」とのこと。

ALL関数 = CALCULATE(SUM('2025_売上'[数量]),ALL('2025_売上'[商品名]))
ぴ

商品名に左右されずに、果物は果物の合計数量である1,599、野菜は野菜の合計数量である3,141がちゃんと表示されているね

ぴ

「商品名」のフィルターをALL関数でクリアしているから、その次に入っているカテゴリごとでフィルターがかかって果物ごと野菜ごとで数量の合計が表示されているんだ

このメジャーを使って果物ごと野菜ごとの割合を出してみましょう。

カテゴリ割合 = DIVIDE(SUM('2025_売上'[数量]),'2025_売上'[ALL関数])
も

わーい

注意点として、ページ右横にある「フィルター」で商品名を絞っていたとしてもALL関数でフィルタークリアされます。
最初、なんとなくこの「フィルター」で商品名を絞ったら、表に入れたALL関数のメジャーも絞った後の合計がでるのかなと思っていたので危なかったです。それについてはこの後のALLSELECTED関数を見てください。

ぷ

…? カテゴリ割合の合計おかしくない?

ぴ

ALLSELECTED関数なら大丈夫だったと思う
スクロールしてそっち見て

全体の合計/全体の割合を出す

ALL関数

上の表の商品名の数量が全体の合計数量である4,740のうち何%を占めているのかを出して表示したいと思います。

ぷ

さっきの感じだと、SUMで全体の合計を出して割るんじゃあダメなんでしょ

もう一回やってみましょう。SUMの合計メジャーとそれで割って割合を出したメジャーを入れます。

数量合計 = SUM('2025_売上'[数量])
数量割合 = DIVIDE(SUM('2025_売上'[数量]),'2025_売上'[数量合計])
ぷ

うわーやだー

ぴ

SUMで全体の合計を出したつもりでも、表に入れれば商品名で分解されちゃうね

ぴ

さっきのALL関数で今度は「商品名」も「カテゴリ」もフィルタークリアしよう

先ほどは商品名のみALL関数を使って記述しましたが、今回はその後ろにカテゴリも追加されています。

ALL関数_数量合計 = CALCULATE(SUM('2025_売上'[数量]),ALL('2025_売上'[商品名]),ALL('2025_売上'[カテゴリ]))

割合を出すメジャーも作ります。

数量割合 = DIVIDE(SUM('2025_売上'[数量]),'2025_売上'[ALL関数_数量合計])

では表に入れてみましょう。

ぷ

いいね

ぷ

でもこれ表の中の全部の列を指定しないといけないの?めんどみMAX

ぴ

列じゃなくテーブル全部も指定できるんだ。結果は一緒だよ

ALL関数その2 = CALCULATE(SUM('2025_売上'[数量]),ALL('2025_売上'))

実は後から気が付きました。列ごとに指定するより上のやつ使ってください。

完成
並べるとこんな感じです。
メジャー名が適当なのは目をつぶってください。なにも考えてませんでした…。

ALLEXCEPT関数

全体の合計を固定で出したいならALL関数よりもっといいのがあるのを見つけました。
ということでALLEXCEPT関数を使ってみようと思います。

Power BI曰くALLEXCEPT関数とは「指定された列のフィルターの影響を受ける行を除く、テーブル内のすべての行を返します。」とのこと。

ぴ

ALLEXCEPTを使うと一つずつ列をALL関数でフィルタークリアしなくてよくなるよ

ALL関数▼

ALL関数 = CALCULATE(SUM('2025_売上'[数量]),ALL('2025_売上'[商品名]),ALL('2025_売上'[カテゴリ]))

ALLEXCEPT関数▼

ALLEXCEPT関数 = CALCULATE(SUM('2025_売上'[数量]),ALLEXCEPT('2025_売上','2025_売上'[数量]))

結果比較▼

も

ちゃんと数字がでてる!

ALLEXCEPT関数は指定した列以外のフィルターをクリアすることができます。先ほどのALL関数ではフィルターをかける側を指定してフィルターのクリアをしていました。

ALLEXCEPT関数ならフィルターをかけられる側、つまりフィルターの影響を受けたくない「数量」を指定すればいいのでわかりやすいですね。

全体の合計/全体の割合を出す(でもスライサーは使いたい)

ALLSELECTED関数

ぷ

ALL関数やALLEXCECT関数だとスライサーや視覚化の隣のフィルターが使えないのがなぁ

も

スライサーで絞った値に合わせて合計も変化してほしいね

上の表ではオレンジ、キャベツ、きゅうり、じゃがいもの4つでスライサーをかけています。であるならば表内の合計も選択した4つの合計1,206が表示されて欲しいですね。スライサーで選択した項目によって分母である合計値が変わるイメージです。

ぴ

ALLSELECTED関数を使おう

Power BI曰くALLSELECTED関数とは「テーブルのすべての行、または列のすべての値を返します。クエリ内で適用されている可能性があるフィルターはすべて無視されますが、外部からのフィルターは保持されます。」とのこと。

ALLSELECTED関数 = CALCULATE(SUM('2025_売上'[数量]),ALLSELECTED('2025_売上'))

ちゃんとスライサーで選択した商品の数量合計になっていますね。

スライサーで選択する商品名を変えてもちゃんと動いています。

ALLSELECTED(‘2025_売上’)の部分はスライサーで使いたいデータが入っているテーブルを指定しています。つまり「2025_売上」テーブルのデータならスライサーやフィルターをかけることができるということです。

ここでは試していませんが、もし別テーブルのデータをスライサーで使いたいならそれも指定してあげないと動かないと思います。たぶん。

タイトルとURLをコピーしました