Power BIのALLSELECTED関数とは ALL系関数との違いや使い方を分かりやすく解説
目次
Power BI でレポートを作成していると、
「ページフィルターやスライサーで絞り込んだ条件は残したまま、マトリクスやチャートごとに柔軟に集計したい」
そんなニーズに直面することはないでしょうか?
たとえば、特定の地域や年代に絞り込んだ状態で、
- 全体の平均値や標準偏差を取りたい
- マトリクス内でカテゴリ単位の偏差を計算したい
といったケースです。
ところが通常のDAX関数では、
「すべてのフィルターを無視する」か「すべて適用する」かしかできず、「一部だけフィルターを維持して、あとは無視する」という柔軟な制御は意外と難しいものです。
このような場面で役立つのが、ALLSELECTED関数です。
本記事では、
- ALL系関数(ALL、ALLSELECTEDなど)の違い整理
- ALLSELECTED関数の使い方と具体例
をわかりやすく紹介していきます。
Power BIのレポート作成で一歩進んだ表現を実現したい方は、ぜひ参考にしてみてください。
一部のフィルターは残したまま、それ以外のフィルターは無視して計算したい
私自身、Power BI でレポートを作成している中で、次のような課題に直面しました。
- ページフィルターやスライサーの条件は適用したい
- ただし、マトリクス内のカテゴリごとのフィルターだけは無視して計算したい
- レコード全体での平均や標準偏差を求めたい
- それでいて、特定の年齢層や地域などでのフィルタリングは維持したい
- さらに、できれば Power Query の加工も極力減らしたい
簡単に言えば、
「一部のフィルターは尊重しつつ、その他は無視して自由に集計したい」というわがままなニーズです。
通常のDAX関数だけでは、この柔軟な制御は難しいのが現実でした。
そんなときに非常に役立つのが、ALLSELECTED関数です。
ALLSELECTEDを使うことで、
- ページやレポートレベルのフィルター
- スライサーの選択状態
といった外部のフィルタリングは維持しながら、マトリクスやビジュアル内の行・列カテゴリによるフィルターだけを無視して計算することが可能になります。
次章では、この ALLSELECTED 関数を使って、実際にどのような集計ができるかを見ていきましょう。
今回のゴールとしてALLSELECTED関数を作るとこんな表が作成できる!
今回のゴールは、ALLSELECTED関数を使って「必要なフィルターだけを適用した状態で、柔軟な集計を行う表」を作成することです。
たとえば、
- ページフィルターやスライサーで指定した条件を適用しながら
- マトリクス内部ではカテゴリ(地域など)による集計単位を無視して
- 全体に対する平均や標準偏差を計算できる
こういった柔軟なレポート表現が可能になります。
このあと、具体的に
- ALL関数を使った場合の動き
- ALLSELECTED関数を使った場合の違い
を順に見ながら、実際に動作の違いを体験していきます。
DAX関数のALL関数を使ってみる
最初に試したアプローチは、すべてのフィルターを無視して集計する方法です。
ここで登場するのが、DAX関数のALL関数です。
ALL関数を使うと、特定のテーブルや列に適用されているフィルターを完全に解除し、すべてのデータを対象に計算を行うことができます。
たとえば、次のようなメジャーを作成してみました。
平均値 = AVERAGEX( ALL( 'テーブル名' ) , [値] )
たとえば、都道府県と市区町村の階層構造を持つデータで、ページレベルフィルターに「埼玉県・2015年」を設定しているとします。この状態でALL関数を使った平均値を確認すると、市区町村の数が少なく、「想定よりもデータが欠けているのでは?」という違和感がありました。
そこでページフィルターを一度すべて解除して同じ計算を確認してみると、ALL関数による平均値が「合計値 ÷ レコード数」と一致していることがわかりました。
つまり、ALL 関数はページレベルフィルターさえも無視し、データ全体を対象に計算しているということです。
この動きは、ALL関数の公式説明とも一致しています。
適用されているフィルターをすべて無視し、テーブル内のすべての行(列内のすべての値)を返します。
この関数は、フィルターをクリアしてテーブル全体に基づく計算を実行する際に便利です。
引用:Microsoft DAX 関数リファレンス
ALL 関数 (DAX) – DAX | Microsoft Learn
ALLSELECTED関数を使った集計結果の確認
ALL関数では、すべてのフィルターを無視してしまう問題がありました。
次に試したのが、ALLSELECTED関数です。
平均値 = AVERAGEX( ALLSELECTED( 'テーブル名' ) , [値] )
この関数はどのように作用するでしょうか。
※「上記画像は、スライサーで『埼玉県・2015年』が選択されている状態です」
表グラフには「都道府県」「人口」「ALLSELECTEDでの平均値」の3列を表示しています。
通常であれば、市区郡ごとに人口が異なるため、平均値も行ごとに変化するはずです。しかし、この表では**「ALLSELECTEDでの平均値」がすべての行で同一値(114,381)となっています。これは、ALLSELECTED関数がマトリクス内のカテゴリ(市区郡)によるフィルターを無視し、「スライサーやページレベルフィルターの影響だけを残して平均を計算している」ことを意味しています。
実際、左側に表示された CityCode のカウント は 63 に対し、 ALLでのカウント は 1,809 と差があります。
この差分が、ALLSELECTEDが「市区郡」の粒度を無視している証拠になります。
また、スライサーで別の都道府県を選んだ場合や、他のビジュアル(グラフ・チャート)をクリックして絞り込んだ場合でも、ALLSELECTED関数は正しく動作し、期待通りの集計結果が得られました。
このように、ALLSELECTED関数を使うことで、「必要なフィルターだけを尊重し、内部カテゴリによる絞り込みは無視する」という柔軟な集計処理が実現できることが確認できました。
ここで新たな疑問が浮かびます。
ALLSELECTED関数を使うことで、思い通りの結果が得られたことがわかりました。しかし、なぜこのような制御が可能になるのでしょうか?
次の章では、ALLSELECTED関数の動作原理について、詳しく整理していきます。
ALLSELECTED関数の意味を整理する
まずは基本の基本ALLSELECTED関数のリファレンスを見てみましょう。
現在のクエリの列および行からコンテキスト フィルターを削除し、他のすべてのコンテキスト フィルターと明示的なフィルターは保持します。
ALLSELECTED 関数は、クエリのすべての列および行を表すコンテキストを取得する一方で、
行フィルターおよび列フィルター以外の明示的なフィルターおよびコンテキストを維持します。
この関数を使用して、クエリの表示部分の合計を取得できます。-MSDN DAX 関数リファレンス-
https://msdn.microsoft.com/ja-jp/library/gg492186.aspx
この記述を一言で整理すると、ALLSELECTED関数は次のように動作します。
- レポート上の表示(行・列)で適用されているフィルターだけを無視
- スライサーや他のページ・ビジュアルからのフィルターは維持して計算を行う
つまり、ビジュアル内部の分割カテゴリ(例:行・列の構成)に影響されず、外部フィルターの条件は保ちつつ集計する、という非常に柔軟な動きができる関数です。リファレンスだけでは少し理解しづらいところもあるため、このあとで 実際の動作やフィルターとの関係性を整理して確認していきます。
メジャーとフィルター、ビジュアルの関係を整理する
まずは、Power BI の「マトリクス」ビジュアルの動きから見てみましょう。
マトリクスは行・列それぞれにカテゴリを割り当てて、そのカテゴリごとでの値を表示するビジュアルです。たとえば、「地域 × 年代」などのように、2軸で集計できるため、多くの分析シーンで活用されています。
このビジュアルは以下の図のように、クエリに対してフィルターをかけたときに該当するデータの集計を表示するものです。下図の合計のところには他にも平均値や中央値、最初の値など、集計値を選択することができます。
では、実際に平均値をメジャーで作成し、それをマトリクスの「値」に設定してみましょう。
さいたま市も川口市も人口と平均値が一緒になりました。この結果は、それぞれのカテゴリに1件だけのレコードが対応しているため、人口 ÷ 1 = 人口 という計算になっているからです。
このように、マトリクスの行・列に入れたカテゴリでフィルタリングをかけたあとに、平均値を出力するメジャーの計算を行っていることがわかります。
この処理の順序は他のビジュアルでも基本的には共通しており、次のような順番で行われていると考えられます。
- ビジュアルにおいての分類によるフィルタリングが行われる
- メジャーにおいてのフィルタリング・処理が行われる
フィルターが複数ある場合の適用順を整理する
Power BI では、以下のように複数レベルのフィルターが存在します。
ページレベルフィルター:指定されたページにのみ適用
ビジュアルレベルフィルター:特定のグラフやテーブルなどのビジュアルにだけ適用
スライサー:ユーザーが操作することで、動的にフィルターをかける
これらのフィルターは、DAXの計算が行われる前に段階的に適用されていきます。
(推定される適用順)
② スライサーによるフィルター
③ ビジュアルでの行・列カテゴリによる絞り込み(例:マトリクス)
④ メジャー関数内でのフィルター処理(例:ALL、ALLSELECTEDなど)
このように、**スライサーは「ユーザーによるフィルター」**として、レポート構造的なフィルターの後段で適用されます。
つまり ALLSELECTED を使えば、「③ の内部カテゴリによる絞り込みだけを無視して、①や②の条件は尊重する」
というような、柔軟なフィルターコントロールが可能になるわけです。
まとめ:ALLSELECTED関数で実現できることの整理
ここまで見てきた動作から、ALLSELECTED関数が果たす役割を整理しましょう。
ALLSELECTED関数は、以下のようにフィルターを柔軟に制御します。
- ビジュアル内部(行・列など)によるフィルタリングは無視
- スライサーやページレベル/レポートレベルのフィルターは維持
(例:マトリクス内で自動的に分割されたカテゴリ)
(例:ユーザーが設定した期間やエリアの絞り込み)
つまり、ユーザーが意図的に指定した条件は活かしながら、ビジュアル特有の自動フィルターだけを取り除いて計算できる、非常に柔軟なDAX関数だといえます。
さらに詳しく学びたい方は、Microsoft公式の DAX 関数リファレンスもぜひ参考にしてください。
引数の説明から使用例まで詳しくまとめられています。(一部英語ページあり)
MSDN DAX関数リファレンス(ALLSELECTED)はこちら
もし、この記事を読んで「もっと実践的に学びたい」「実際にレポートを作りながら理解を深めたい」という方がいらっしゃいましたら、弊社ではPower BIの導入支援やハンズオンセミナーも実施しています。
ぜひお気軽にご相談ください。
<Power BIハンズオンセミナー>
弊社ではPower BIをはじめとするさまざまな無料オンラインセミナーを実施しています!
>>セミナー一覧はこちら
<Power BIの導入支援>
弊社ではPower BIの導入支援を行っています。ぜひお気軽にお問い合わせください。
>>Power BIの導入支援の詳細はこちら
<PowerBIの入門書を発売中!>
弊社ではPower BIの導入から基本的な使い方・活用方法の基礎などをわかりやすく解説した書籍も販売しています。
>>目次も公開中!書籍の詳細はこちら