2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Power BIにおける累計計算でDAXの仕組みが「チョットワカル」ようになる

2
Last updated at Posted at 2026-03-29

Power BIを使い始めて、表計算(累計や合計に対する割合など、合計や平均の後に処理する計算のこと)がなかなかうまくいかないと、心が折れた経験はないでしょうか?

私はTableauを長年使ってきたので、Tableauならば「簡易表計算」ですぐできることが、
Power BIだとこんなにも難しいのかと何度も心が折れました。

でも、根本的にTableauとPower BIでは、ユーザーにとっては考え方を変えた方が良いことに気づきました。

まず基本的なPower BIの概念をおさらいしましょう。

Power BIを実務で使うにあたって必要な基本的事項

  1. グラフを作る際は、「ビジュアル」を選択し、そこに項目を当てはめていく
  2. 合計や平均で処理しきれないものは、DAX(Data Analytics Calculation)という計算式を使って列のようなものを作る
  3. DAXには以下の3種類があり、それぞれ適切に使い分ける必要がある
    1. 新しいテーブル
    2. 新しい列
    3. メジャー

(DAX式の例)
image.png

これらを踏まえたうえで、Power BIにおける累計計算をもとに、DAX計算の仕組みを解説したいと思います。

この記事に向いている人

  1. Power BIを日頃から使っているが、DAXがいまいちよくわからない
  2. DAXは主に生成AIに書かせてコピペしているが、いまいち理解できていない
  3. 全部とはいかずとも、SQLともExcel関数とも違うDAXの仕組みをチョットは理解したい
  4. TableauからBIツールを学び、Power BIを扱ってみて「難しい」と感じている方(←筆者はTableauから入ったので、ちょいちょい「Tableauに例えると..」といったネタを織り込みます)

この記事に向いていない人

  1. Power BIを初めて触ったばかりの方
  2. すでにPower BIでゴリゴリDAXを書いている方

ダニングクルーガー曲線における、「全然わからない」状態に陥っている方がこの記事を読み実務で活かすことで、この赤丸辺りにステップアップできることを目指していきます。
(chatGPTで作成)
image.png

(※Geminiより引用)

ダニング=クルーガー曲線は、知識や経験(横軸)と自信(縦軸)の関係を示したグラフで、能力の低い段階で自信がピークに達し(馬鹿の山)、その後知識が増えるにつれて自信を失い(絶望の谷)、最終的に正しい自信を持つ(啓蒙の坂~継続の大地)という成長プロセスを表現したものです。初心者が過信してしまう心理現象を視覚化したものです。

はじめに:この記事におけるDAXの接頭辞

私はあとで検索しやすいよう、以下のようDAXに接頭辞を付けています。
「データ」サイドバーの検索ボックスで、たくさん作ったDAXから使いたいものを探すときに非常に便利です。
(アンダーバー(_)があることで、列名にMやTが入るものを検索除外できるので、おススメです)

 ・メジャー="M_"
 ・テーブル="T_"
 ・列="C_"

DAX累計計算の定石

多くの場合において、私が辿り着いた累計の「定石」と言える書き方が、以下になります。

M_売上累計 = CALCULATE(
  SUM([売上]), //集計したい値のメジャーが入る
  FILTER(
    ALLSELECTED('カレンダーテーブル'), //カレンダーテーブルが入る
    'カレンダーテーブル'[FYMonthNo] = MAX('カレンダーテーブル'[FYMonthNo]), //カレンダーテーブルで累計を積み重ねたい数値が入る。
    )
  )

いきなりこんなものを見せられても訳わからないと思うので、想定とされるテーブル構造をご紹介します。
Power BIではよく使うモデリングなので、上記の累計計算は馴染みやすいと思います。

※Power BIでは「スタースキーマモデル」といって複数のマスタ・トランザクションテーブルを組み合わせてデータを構成します。細かい解説は避けるので、「Power BI スタースキーマ」といったキーワードでググってみてください。

テーブル構造

Calender(マスタ) ---> 実績明細(トランザクション)

(Power BI「モデリング」ビューでみられるスタースキーマ構造の一部)
image.png

実務でもよく使われる予算管理データを想定しており、以降ご紹介するデータはchatGPTに作らせた架空の予算データです。
実務ではこの他にも「予算マスタ」や別のトランザクションデータとも組み合わせたりしますが、いったん年月とトランザクションだけのシンプルな構造とします。

DAX累計計算を読み解く

それではこの、カレンダーテーブルと予算実績明細をくっつけていると想定した上で、
「チョットワカル」ようになるため段階的に説明していきます。

ステップ①:何をしているか概要理解

M_売上累計 = CALCULATE(
  SUM([実績]),
  FILTER(
    ALLSELECTED('CalenderMonth'),
    'CalenderMonth'[FYMonthNo] = MAX('CalenderMonth'[FYMonthNo]),
    )
  )

※CalenderMonth...カレンダーテーブルですが、予算関係は日付単位のデータにはなり辛いので、年月だけの簡素的なカレンダーとしているため、この名称です。日付単位のデータであれば、TOTALYTD等を使ってもう少し簡素的に累計計算も可能です。

まずこの、「CALCULATE」とはなんでしょうか?
非常に奥深い関数で、DAXを使うなら絶対に避けて通れないものです。
深い所まで理解すると、CALCULATE関数だけで、5記事くらい作れる方もいらっしゃると思います。
ひとまずここでは、「こういうものなんだな~」というのを抑えて頂ければ大丈夫です。

ステップ②:「フィルターコンテキスト」を知る

まず、「フィルターコンテキスト」を理解する必要があります。
でも、「フィルターコンテキスト」という言葉は覚えなくて大丈夫です。
Power BI用語は難しい概念がたくさんでてきますので共通言語としては専門用語を抑えるのは良いですが、何よりも理解しやすい自分の言葉であることが大事です。
慣れない方はとりあえず「フィルター」でOKです。データを絞り込むやつです。

Tableauから来た人は、「フィルター」と言えば左上の方のこの部分をイメージするでしょう。
(Tableauにおける「フィルター」)
image.png

これは、Power BIに相当する言葉は「フィルター」ではなく「スライサー」に近いです。
「スライス」と聞くと私は当初真っ先に調理器具の方を思い浮かべましたが、ある意味近いです。
image.png

データを切り取る「道具」であり、ダッシュボードの中でマウスをポチポチしてデータを絞り込んでいくものですね。
それに対し「フィルター」とは、Tableauにおける「ディメンション」、つまり「データをなんら区切っているもの」と考えます。
スライサーもその一つ。具体的には以下のようなものがあります。

フィルターコンテキストの例

  • テーブル・マトリクスの列
  • スライサー
  • 棒グラフ/折れ線グラフのX軸・Y軸
  • 円グラフの凡例
    ...etc...

例えば、1000行の予算実績データがあるとします。
そのデータの実績総額は100億円とします。
でも、ダッシュボードを作成すると「予算実績」に関して100億円以外の値も出したいですよね?
3月は10億だった、A部署は30億だった...
それは、それぞれ「年月」や「部署」といった「フィルター」がかけられることで、10億や30億といった数値になっています。
分かりやすいのは「ビジュアルフィルター」です。
棒グラフや円グラフのX軸や凡例に何が置くかで、実は「フィルター」がかかっているのです。
レポートビューのサイドバーにあるこの部分ももちろんフィルターて、ビジュアルやDAXの前にかかる、強力なフィルターです。
image.png

それを踏まえた上で、「CALCULATE」について考えてみましょう

ステップ③:「CALCULATE」とは

CALCULATE関数はずばり、「フィルターを外して、自分の好きなフィルターをかけられる」ものです。
Tableauでいうとみんな大好き「FIXED」です。でも、FIXEDとは使い所がかなり違ってきます。
それに後述するFILTER関数の方が、FIXEDに近い側面もあります。

一番分かりやすい例は、Power Query等を使わずに列を「ピボット化」する際です。

例えば以下のようなデータで

部署 売上
A部 4月 5000
A部 5月 1000
A部 6月 2000
B部 4月 3000
B部 5月 5000

A部だけの列を作りたいというのがあったとします。
そうするとこういう式になります。

M_A部売上 = CALCULATE(SUM([売上],
  [部署]="A部")

そうしてテーブルに追加すると、こういう「M_A部売上」が作られます。

部署 売上 M_A部売上
A部 4月 5000 8000
A部 5月 1000 8000
A部 6月 2000 8000
B部 4月 3000 8000
B部 5月 5000 8000
合計 16000 8000

A部の売上合計は、5000+1000+2000=8000円です。
[M_A部売上]の中のCALCULATE君がテーブルにある[月][売上]という2つのフィルターを無視してくれるので、全行同じ値になります。
ただし総計である16000円ではないですね。
なぜならCALCULATEの式で

[部署]="A部"

と書いてあるので、「[部署]のフィルターは使うし、"A部"だけに絞るよ!」ということになります。

以上が、CALCULATEの基礎になります。
Power BIを学びたての方は、これから色んなネットに書いてあるDAXの説明、また生成AIの出力式には、
とりあえずお決まりのように毎回CALCULATEではじまっていることに面食らうことが多いと思います。
そのように「とりあえずCALCULATE」を発見したら

ビジュアルで色々フィルターを掛け違えるんだろうけど、ここではCALCULATEでフィルターを統一しとくよ!
そうしないと、ビジュアルに置いた時めっちゃおかしくなっちゃうから、魔法かけとく!

ってことだと思ってください。おまじないみたいにCALCULATEを使います。

ここを踏まえると、かなり中級の方に入ってきました。

そこで次はFILTER関数のお話です。

ステップ④:FILTERって何?CALCULATEとどう違うの?

FILTERは少し難しいので、概要理解に留めます。
「CALCULATE」が「フィルターをかけなおす」ものなのに、「カリキュレイト(計算する)」などと抽象的な名前になり、おもいっきり「フィルター(FILTER)」と、もう思いっきり言ってしまっているFILTER関数と両方あるって、どういうこと?
と、私は当初だいぶ混乱しました。

それには、テーブル関数という分類の違いです。

FILTER関数についてMicrosoft公式リファレンスを見てみると

image.png

別のテーブルまたは式のサブセットを表すテーブルを返します。

公式リファレンスは何かと日本語が難解なのですが、

テーブルを返します。

ここが一番重要です。
CALCULATE関数は基本的に「一つの値」(=「スカラ値」と言います。データ処理用語なのでご存じない方はぜひ覚えておきましょう)を結果に返します。
でも、FILTERは「表形式」で出力結果を返してくれます。
試しに、「新しいメジャー」としてFILTER関数の式を作ってみましょう。
シンプルに、2025年4月の実績だけ出したいとします。

M_4月の実績 = FILTER('実績明細','実績明細'[C_YM]="2025/04")

しかしこれをPower BIにいれると
image.png
このようにエラーになります。
スカラ―値に変換することはできません」と出ている通りです。
メジャーは「一つの値(スカラ値)」を返すので、FILTER関数の結果そのものを出すことはできません。
1個ずつしか出てこない自動販売機に、5個くらいドカッとジュースを吐き出してくれ、と言っているようなものです。
でも、安心してください。Power BIにはちゃんと、ジュースをドカッと一気に吐き出し食てくれる専用の自動販売機機能があります。

「新しいテーブル」といって、Power BI上でテーブルを作る機能です。
image.png
これを使うことで、カレンダーテーブルを作ったり、別テーブルから必要列だけ絞って簡易テーブルを作ることなどができます。

ここに先ほどの式を入れてみましょう。

image.png
このように、2025/4のデータに絞られた状態でテーブルができました。
これが「テーブル関数」の一つであるFILTER関数です。

また、今回使うALLSELECTED関数もFILTER関数です。
FILTERがわかればあまり難しい概念ではありません。

ALL=フィルターコンテキストを無視して引数のテーブルを全部返す

ALLSELECTED=フィルターコンテキストを無視して引数のテーブルを返すけど、「**スライサーは無視しない**」

要するに、FILTERの中に「どのテーブルか」を指定する際もちゃんとフィルターコンテキストを外してやらないと、うっかりビジュアルに置いた項目の区切り方(ビジュアルフィルターコンテキスト)に引きずられてしまいますよ、ということです。

では、いよいよ冒頭に提示した累計計算を紐解いていきましょう。

累計を作る

M_売上累計 = CALCULATE(
  SUM([売上]),
  FILTER(
    ALLSELECTED('カレンダーテーブル'),
    'カレンダーテーブル'[FYMonthNo] = MAX('カレンダーテーブル'[FYMonthNo]),
    )
  )

一番外側はCALCULATE式です。CALCULATEの文法構造は、Microsoftリファレンスによると以下です。
image.png

image.png

expression=評価する式、というのが分かりにくいですが、要はメジャーです。ここには合計や平均などを施した集計計算のメジャーが入ります。
「M_売上累計」でも、SUM([売上])が入っていますね。
第二引数はとあり、ここで絞り込む式を入れていきます。
[,<filter2>]..とあるので複数のフィルターをたくさん追加することができます。
例えば

M_2015年B部実績 = CALCULATE(SUM([実績], [年月]=2015, [部署]="B部")

のようにできます。
なのでここでは、

CALCULATEを使って、ビジュアルが変わっても大丈夫なように、実績額のフィルターをこの計算の中で設定するよ。
使うフィルターはFILTER関数の条件に当てはまったテーブルで照合するよ

ということです。
image.png

Tips: 暗黙のメジャー

ちなみにPower BI Data Analyst試験(PL-300)を受ける方は、「暗黙のメジャー」という、これまた訳の分からない用語に出くわす可能性もありますが、なんてことない、メジャーとして式を作っていないけど集計計算ですというだけの話です。

SUM([実績額])

この部分は、メジャーではないけど集計計算、つまり「暗黙のメジャー」ですよ、というのがPL-300の試験範囲です。
実務でこの言葉をいうことはほぼないと思いますが、試験の為に覚えておきましょう(;^ω^)
気になる方はMicrosoft Learn > 暗黙的なメジャーをどうぞ

また私も使いたて当初、ひとまず数値の列は

M_売上合計 = SUM([売上])

のようにSUMやAVERAGEした値を作りまくっていたのですが、
最近ではCALCULATEの中に入れるにしても、SUM([売上])のように暗黙のメジャーを使っています。
計算がうまくいかなくて式を書き換えたい時、合計や平均などへの切り替えがさっとしやすいためです。

というわけで、こちらに戻ります

M_売上累計 = CALCULATE(
  SUM([売上]),
  FILTER(
    ALLSELECTED('カレンダーテーブル'),
    'カレンダーテーブル'[FYMonthNo] = MAX('カレンダーテーブル'[FYMonthNo]),
    )
  )

CALCULATEとFILTERを使って、条件に合う売上の合計を出していることがわかりました。

ではいよいよ累計の本質、FILTER関数の中身です・

  FILTER(
    ALLSELECTED('カレンダーテーブル'),
    'カレンダーテーブル'[FYMonthNo] = MAX('カレンダーテーブル'[FYMonthNo]),
    )

テーブル名に「カレンダーテーブル」を指定しているので、
カレンダーテーブルを絞り込んでいます。
FILTERで何をしているかわからなくなったら、「新しいテーブル」で出力してみましょう。

image.png

ん~全部ですね!そう、この場合全部なんです。
FYMonthNo.つまり、4月から始まって年度末の3月まで、カレンダーを表示します。

前述の図で、「これの条件に合うものを出す」と簡易的に記入しましたが、
FILTERが入ってくると、こうなります。

「これの条件に合うものを出す」
👇
「これの条件に合うように一行一行SUM([売上])していく」

図で説明しましょう。
image.png

FILTER関数で出力したテーブルに沿って、一行一行合計していく。
合計するのは前の行に続けてどんどん足して(合計して)いく。
4月の合計に、5月の合計を足す、それにまた6月を足す..というように。
だからそれが累計となる。

というわけです。

この結果をテーブルに載せると、このようになります。

image.png

真ん中の「M_累計実績」が、ちゃんと累計になっていることがわかります。
右側の「M_YTD累計」は、TOTALYTDという関数を使ってみたものです。

M_YTD累計 = TOTALYTD([M_実績計], CalendarMonth[Date],"3/31")

これは、累計になっていませんね。[YearMonth]が年月の文字列だからです。
これを、日付列を使って表示してあげると、とこうなります。
image.png

累計になっていますね。このように、日付型をうまくつかえれば「タイムインテリジェンス関数」といってもっとシンプルに累計できるのですが、YYYY-MM形式などを使って表示したい時には、できません。
ここは、本記事の内容よりもずっと理解がしやすいと思うので、後日別記事にまとめたいと思います。

おまけ:可視化

単月実績と累計実績、それぞれ棒グラフにするとこのようになります。

image.png

累計は、詰みあがっていくさまがとても綺麗ですね。
パレート図のように、折れ線グラフと重ねてみてもお金の動きをとても把握しやすく、ぜひ初学者の方にも調整してほしいビジュアルです。

せっかくなので、「プロジェクト名」なども付与してダッシュボードを作ってみました。

image.png
Tableauに慣れると、見た目に統一感のあるビジュアルをPower BIで作るのは至難だと思われるかもしれませんが、Tableauと同じようなビジュアルのポイントを使い書式設定を工夫すれば決して難しくはありません。
そのあたりはまた、Power BIでダッシュボードを「シュッとさせる」コツとして別記事にまとめたいと思います。
このビジュアルはPower BI Proにて全体公開していますので、ご自由にご覧ください。
https://app.powerbi.com/view?r=eyJrIjoiNzRjZmYxZTctYTMxOC00NmM1LTkxMDYtNTYxMDJjZDlmOWFmIiwidCI6ImFkMTBmMzU3LWUxZjYtNGYyYS05MWFjLTcyMGY2NTlmM2I4NSJ9

おわりに

以上で、CALCULATE, FIlTERに続く累計の解説は以上になります。
この記事が、DAXの計算の中身が分からなくて苦しんでいる方、名付けて「DAX難民」の方へ、何らかの力になれば嬉しいです。
DAXはその難解さゆえに「理解を諦めた方がコスパがよい」とも言われます。
でもそれは、非常に勿体ないことだと思います。
DAXがわかればビジュアルの幅もとてもたくさん広がりますし、
「実務でダッシュボードを使い組織をこんな風に動かしたい」というのがあってもDAXがめんどくさいから諦める、というのは非常に勿体ないです。

CALCULATEやFILTERの他にも難解な計算や概念はたくさんありますので、できるだけ初学者の方のチカラになるよう、記事作成を続けたいと思います。
最後まで読んでいただき、ありがとうございました。

2026.3某日
Rieko Tanaka (DATA Saber, X: @Rieko_shinji)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?