「Power BIを使い始めたけど、DAX関数って何から覚えればいいの?」
Excelの関数と似ているようで微妙に違う書き方に、最初は戸惑いますよね。しかもDAX関数は200以上あります。Microsoft Learnの公式ドキュメントを眺めても情報量が多すぎて、どこから手をつけるか迷いがちです。
この記事では、DAX関数を機能別に整理した一覧表と、最初に覚えるべき7つの関数をまとめました。「やりたいこと」から逆引きできる目的別リファレンスなので、ぜひブックマークして使ってください。
なお、Excelの関数を探している方はExcel関数一覧(機能別)をどうぞ。SUMやVLOOKUPなどの基本関数はExcel関数一覧(アルファベット順)から引けます。
DAX関数とは?Excel関数と何が違うの?
DAX(Data Analysis Expressions)は、データ分析用の数式言語です。Power BIやExcelのパワーピボットで使います。見た目はExcel関数に似ていますが、中身はかなり別モノです。
DAXが必要になる場面
DAXが活躍するのは、こんな場面です。
- Power BIのレポートで売上集計や前年比を出したい
- Excelのパワーピボットでピボットテーブルに独自の計算を追加したい
- 複数のテーブルをまたいで分析したい
- SQL Server Analysis Services や Azure Analysis Services で集計モデルを作りたい
ふだんのExcel作業では使わない関数ですが、Power BIに触れるなら避けて通れません。ExcelのGETPIVOTDATA関数のように、ピボット系の集計を扱う方はとくに知っておきたいところです。
Excel関数との違い3つ
ExcelとDAXの大きな違いを3つにまとめました。
| 比較ポイント | Excel関数 | DAX関数 |
|---|---|---|
| 参照方法 | セル範囲(A1:A10) | テーブル[列名] |
| 計算の仕組み | 固定のセル参照 | フィルターコンテキストで動的に変化 |
| COUNTIF相当 | SUMIFS関数やCOUNTIFがある | COUNTROWS + FILTERの組み合わせ |
とくに重要なのがフィルターコンテキストという考え方です。Power BIのスライサーや行ラベルの選択状態に応じて、計算対象が自動的に変わります。
たとえば「売上合計」というメジャーを作るとします。スライサーで「東京」を選ぶだけで、東京の売上だけが集計されるしくみです。Excelのように条件式を書き直す必要がありません。
フィルターコンテキストと行コンテキストの関係
DAXには2種類のコンテキストがあります。ここでつまずく方がとても多いので、最初に整理しておきましょう。
| コンテキスト | 発生タイミング | 用途 |
|---|---|---|
| フィルターコンテキスト | ビジュアル・スライサー・CALCULATEの引数 | 「どの範囲のデータを集計するか」を決める |
| 行コンテキスト | 計算列・SUMXなどのイテレータ関数 | 「1行ずつ処理する」ときに作られる |
CALCULATEは行コンテキストをフィルターコンテキストに変換する「コンテキスト変換」という特殊な動きをします。SUMXなどのX系関数の中でCALCULATEやメジャーを呼び出すと、自動でこの変換が起きる点を覚えておきましょう。
NOTE
フィルターコンテキストと行コンテキストの違いは、DAXでつまずきやすい最初の壁です。まずは「スライサーの選択状態=フィルターコンテキスト」「1行ずつの処理=行コンテキスト」と覚えてください。
まず覚えるべきDAX関数7選
200以上ある関数のなかでも、まずこの7つを覚えれば基本的な分析はカバーできます。
CALCULATE – 条件付き集計の要
DAXの中核ともいえる関数です。フィルターコンテキストを上書きして、条件付きの集計ができます。
東京売上 = CALCULATE(
SUM(売上[金額]),
売上[地域] = "東京"
)
スライサーの状態に関係なく「東京」だけの売上を返します。CALCULATEはDAXで最も使う関数なので、真っ先に慣れておきましょう。ExcelでいうSUMIFSの強化版のような位置づけです。Excel側の条件付き集計はSUMIFS関数と比較しながら学ぶと理解が早まります。
SUMX – 行単位の計算と集計
テーブルの各行で計算してから合計する関数です。「単価 x 数量」のような行ごとの計算に使います。
売上合計 = SUMX(
売上テーブル,
売上テーブル[単価] * 売上テーブル[数量]
)
ExcelのSUMPRODUCTに近い感覚で使えますよ。SUMXは「行コンテキスト」を作りながら処理するため、行ごとの計算結果をあとから合計できます。AVERAGEX・COUNTX・MAXX・MINXなど、同じ考え方の関数が一式そろっています。
FILTER – 絞り込みテーブル
テーブルから条件に合う行だけを取り出します。CALCULATEと組み合わせることが多いです。
高額売上 = CALCULATE(
SUM(売上[金額]),
FILTER(売上, 売上[金額] > 100000)
)
単純な条件ならCALCULATE単体で書けます。しかし複雑な条件や複数列をまたぐ条件では、FILTERが必須になります。
ALL – フィルターを外してパーセント計算
テーブルや列に適用されたフィルターをすべて解除します。構成比(パーセント)を出すときに欠かせません。
売上構成比 = DIVIDE(
SUM(売上[金額]),
CALCULATE(SUM(売上[金額]), ALL(売上))
)
分母を「フィルターなしの全体合計」にします。すると各カテゴリの構成比が求められます。ALLEXCEPTを使えば、特定の列のフィルターだけを残すことも可能です。
RELATED – テーブルをまたいで値を取る
リレーションシップで関連づけたテーブルから値を引っ張ります。ExcelのVLOOKUPに近い役割です。
カテゴリ名 = RELATED(商品マスタ[カテゴリ])
リレーションシップが設定済みなら、RELATED一発で取れます。設定がない場合はLOOKUPVALUEを使ってみてください。Excel側でVLOOKUPを使っている方は、VLOOKUP関数の考え方と対応させて覚えると入りやすいです。
DIVIDE – ゼロ除算を安全に処理
DAXの割り算は、/ 演算子ではなく DIVIDE を使うのが鉄則です。
利益率 = DIVIDE(
SUM(売上[利益]),
SUM(売上[売上高]),
0
)
分母がゼロのときは第3引数の値(この例なら0)を返します。/ 演算子だとInfinityエラーが出て、ビジュアルが壊れることも。前年比や構成比など、割り算を含むメジャーでは必ずDIVIDEを使いましょう。
SWITCH – 条件分岐の定番
IF文をネストしたくなるような条件分岐は、SWITCHで書くとスッキリします。
売上ランク = SWITCH(TRUE(),
[売上合計] >= 1000000, "A",
[売上合計] >= 500000, "B",
[売上合計] >= 100000, "C",
"D"
)
SWITCH(TRUE(), 条件1, 結果1, 条件2, 結果2, ..., 既定値) の形が定番です。IF文の深いネストより可読性が上がり、修正もしやすくなります。ExcelのIFERROR関数と同じ発想ですが、条件分岐は SWITCH、エラー処理は IFERROR と使い分けましょう。
【機能別】DAX関数一覧
ここからは、DAX関数を機能別に一覧で紹介します。やりたいことからカテゴリを選んで探してみてください。
集計関数
SUM・AVERAGE・COUNTなど、データの合計・平均・件数を求める関数です。Excel関数と名前が似ているものが多いので、取りかかりやすいカテゴリですよ。
| 関数 | 説明 |
|---|---|
| APPROXIMATEDISTINCTCOUNT | 列内に個別の値を含む行の概数を返します。 |
| AVERAGE | 列のすべての数値の平均(算術平均)を返します。 |
| AVERAGEA | 列の値の平均(算術平均)を返します。 |
| AVERAGEX | テーブルに対して評価される式の平均を計算します。 |
| COUNT | 列内にある、数値を含むセルの数をカウントします。 |
| COUNTA | 列内の空ではないセルの数をカウントします。 |
| COUNTAX | 式の結果をテーブルに対して評価するとき、空白以外の結果をカウントします。 |
| COUNTBLANK | 1列内の空のセル数をカウントします。 |
| COUNTROWS | テーブル内の行の数をカウントします。 |
| COUNTX | テーブルに対して式を評価するときに、数値を含む行をカウントします。 |
| DISTINCTCOUNT | 列の個別の値の数をカウントします。 |
| DISTINCTCOUNTNOBLANK | 列の個別の値の数をカウントします。 |
| MAX | 列内の最大の数値を返します。 |
| MAXA | 列の最大値を返します。 |
| MAXX | テーブルの行ごとに式を評価し、最大の数値を返します。 |
| MIN | 列内の最小の数値を返します。 |
| MINA | 論理値やテキストも含んだ列の最小値を返します。 |
| MINX | テーブルの行ごとに式を評価した結果の最小値を返します。 |
| PRODUCT | 列内の数値の積を返します。 |
| PRODUCTX | テーブルの各行に評価される式の積を返します。 |
| SUM | 列のすべての数値を加算します。 |
| SUMX | テーブルの行ごとに評価される式の合計値を返します。 |
フィルター関数
データの絞り込みやフィルターコンテキストの制御を行う関数です。CALCULATEやFILTERなど、DAXの核となる関数がここに集まっていますよ。
| 関数 | 説明 |
|---|---|
| ALL | テーブルのすべての行、または列のすべての値を返します。適用されているフィルターはすべて無視されます。 |
| ALLCROSSFILTERED | テーブルに適用されているすべてのフィルターをクリアします。 |
| ALLEXCEPT | 指定した列に適用されているフィルターを除く、テーブル内のすべてのコンテキストフィルターを削除します。 |
| ALLNOBLANKROW | 空白行を除くすべての行を返し、コンテキストフィルターをすべて無視します。 |
| ALLSELECTED | 他のコンテキストフィルターを保持しながら、現在のクエリの列と行からコンテキストフィルターを削除します。 |
| CALCULATE | 変更されたフィルターコンテキストで式を評価します。 |
| CALCULATETABLE | 変更されたフィルターコンテキストでテーブル式を評価します。 |
| EARLIER | 指定された列の外側の評価パスにある現在の値を返します。 |
| EARLIEST | 指定された列の外側の評価パスにある現在の値を返します。 |
| FILTER | テーブルのサブセットを表すテーブルを返します。 |
| KEEPFILTERS | CALCULATE関数の評価中にフィルターを適用する方法を変更します。 |
| LOOKUPVALUE | 検索条件をすべて満たす行の値を返します。 |
| REMOVEFILTERS | 指定されたテーブルまたは列からフィルターをクリアします。 |
| SELECTEDVALUE | コンテキストが1つの個別の値のみにフィルター処理されている場合、その値を返します。 |
タイムインテリジェンス関数
前年比・年度累計・前月比など、日付をベースにした期間計算ができる関数です。Power BIのレポートでとくに重宝するカテゴリですよ。
NOTE
タイムインテリジェンス関数を使うには、データモデルに「日付テーブル(カレンダーテーブル)」が必要です。CALENDAR関数やCALENDARAUTO関数で用意でき、さらに「マークアズデートテーブル」を指定しておくとより安定動作します。
| 関数 | 説明 |
|---|---|
| CLOSINGBALANCEMONTH | 月の最後の日付で式を評価します。 |
| CLOSINGBALANCEQUARTER | 四半期の最後の日付で式を評価します。 |
| CLOSINGBALANCEYEAR | 年の最後の日付で式を評価します。 |
| DATEADD | 指定された間隔数だけ日付をシフトした列を返します。 |
| DATESBETWEEN | 指定した開始日から終了日までの日付列を返します。 |
| DATESINPERIOD | 指定した開始日から指定期間の日付列を返します。 |
| DATESMTD | 月度累計の日付列を返します。 |
| DATESQTD | 四半期累計の日付列を返します。 |
| DATESYTD | 年度累計の日付列を返します。 |
| ENDOFMONTH | 月の最後の日付を返します。 |
| ENDOFQUARTER | 四半期の最後の日付を返します。 |
| ENDOFYEAR | 年の最後の日付を返します。 |
| FIRSTDATE | 現在のコンテキストにおける最初の日付を返します。 |
| FIRSTNONBLANK | 式が空白でない最初の値を返します。 |
| LASTDATE | 現在のコンテキストにおける最終日付を返します。 |
| LASTNONBLANK | 式が空白でない最後の値を返します。 |
| NEXTDAY | 次の日からすべての日付の列を返します。 |
| NEXTMONTH | 翌月のすべての日付の列を返します。 |
| NEXTQUARTER | 次の四半期のすべての日付の列を返します。 |
| NEXTYEAR | 翌年のすべての日付の列を返します。 |
| OPENINGBALANCEMONTH | 月の最初の日付で式を評価します。 |
| OPENINGBALANCEQUARTER | 四半期の最初の日付で式を評価します。 |
| OPENINGBALANCEYEAR | 年の最初の日付で式を評価します。 |
| PARALLELPERIOD | 並列した期間の日付列を返します。 |
| PREVIOUSDAY | 前日のすべての日付の列を返します。 |
| PREVIOUSMONTH | 前月のすべての日付の列を返します。 |
| PREVIOUSQUARTER | 前の四半期のすべての日付の列を返します。 |
| PREVIOUSYEAR | 前年のすべての日付の列を返します。 |
| SAMEPERIODLASTYEAR | 1年前にシフトした日付列を返します。 |
| STARTOFMONTH | 月の最初の日付を返します。 |
| STARTOFQUARTER | 四半期の最初の日付を返します。 |
| STARTOFYEAR | 年の最初の日付を返します。 |
| TOTALMTD | 月度累計の式の値を評価します。 |
| TOTALQTD | 四半期累計の式の値を評価します。 |
| TOTALYTD | 年度累計の式の値を評価します。 |
日付・時刻関数
日付や時刻の値を作成・変換・分解するための関数です。カレンダーテーブルの作成やデータの日付加工に使います。
| 関数 | 説明 |
|---|---|
| CALENDAR | 連続する日付のセットを含むテーブルを返します。 |
| CALENDARAUTO | データモデルの日付に基づいて日付テーブルを自動生成します。 |
| DATE | 指定された日付をdatetime形式で返します。 |
| DATEDIFF | 2つの日付の間にある間隔の境界数を返します。 |
| DATEVALUE | テキスト形式の日付をdatetime形式に変換します。 |
| DAY | 月の日付を1から31の数値で返します。 |
| EDATE | 指定された月数だけ前または後の日付を返します。 |
| EOMONTH | 指定された月数だけ前または後の月の最終日を返します。 |
| HOUR | 時間を0から23の数値で返します。 |
| MINUTE | 分を0から59の数値で返します。 |
| MONTH | 月を1から12の数値で返します。 |
| NOW | 現在の日付と時刻を返します。 |
| QUARTER | 四半期を1から4の数値で返します。 |
| SECOND | 秒を0から59の数値で返します。 |
| TIME | 時間・分・秒をdatetime形式の時刻に変換します。 |
| TIMEVALUE | テキスト形式の時刻をdatetime形式に変換します。 |
| TODAY | 現在の日付を返します。 |
| UTCNOW | UTCの現在日付と時刻を返します。 |
| UTCTODAY | 現在のUTCの日付を返します。 |
| WEEKDAY | 日付の曜日を1から7の整数で返します。 |
| WEEKNUM | 指定された日付の週番号を返します。 |
| YEAR | 日付の年を4桁の整数で返します。 |
| YEARFRAC | 2つの日付間の年の端数を計算します。 |
文字列関数
テキストの結合・切り出し・変換を行う関数です。書式変換のFORMATはレポート表示でよく使います。ExcelのTEXT関数に対応する関数で、TEXT関数と同じ書式指定文字が使えます。
| 関数 | 説明 |
|---|---|
| COMBINEVALUES | 2つ以上のテキスト文字列を結合します。 |
| CONCATENATE | 2つの文字列を結合して1つにまとめます。 |
| CONCATENATEX | テーブルの行ごとに評価される式の結果を連結します。 |
| EXACT | 2つのテキスト文字列を比較し、一致するかどうかを返します。 |
| FIND | 文字列が他の文字列内で最初に現れる位置を返します。 |
| FIXED | 数値を指定された桁数に丸め、テキストとして返します。 |
| FORMAT | 指定した書式に従って値をテキストに変換します。 |
| LEFT | テキスト文字列の先頭から指定された数の文字を返します。 |
| LEN | テキスト文字列の長さ(文字数)を返します。 |
| LOWER | 英字をすべて小文字に変換します。 |
| MID | テキスト文字列の指定位置から指定長の文字列を返します。 |
| REPLACE | テキスト文字列の一部を別のテキストに置き換えます。 |
| REPT | テキストを指定された回数繰り返します。 |
| RIGHT | テキスト文字列の末尾から指定された数の文字を返します。 |
| SEARCH | 特定の文字が最初に見つかった位置を返します。 |
| SUBSTITUTE | テキスト文字列内の既存テキストを新しいテキストに置き換えます。 |
| TRIM | 余分なスペースを削除します。 |
| UNICHAR | 数値で参照されるUnicode文字を返します。 |
| UNICODE | 最初の文字のUnicode数値コードを返します。 |
| UPPER | テキスト文字列をすべて大文字に変換します。 |
| VALUE | 数値を表すテキスト文字列を数値に変換します。 |
論理関数
IF・AND・ORなどの条件分岐やブール演算を行う関数です。Excel関数とほぼ同じ感覚で使えるものが多いですよ。エラー処理に使うIFERRORは、ExcelのIFERROR関数と引数の書き方が同じです。
| 関数 | 説明 |
|---|---|
| AND | 両方の引数がTRUEかどうかをチェックします。 |
| BITAND | 2つの数値のビットごとのANDを返します。 |
| BITLSHIFT | 指定したビット数だけ左にシフトした数値を返します。 |
| BITOR | 2つの数値のビットごとのORを返します。 |
| BITRSHIFT | 指定したビット数だけ右にシフトした数値を返します。 |
| BITXOR | 2つの数値のビットごとのXORを返します。 |
| COALESCE | 空白として評価されない最初の式を返します。 |
| FALSE | 論理値FALSEを返します。 |
| IF | 条件をチェックしTRUEなら1つ目の値、FALSEなら2つ目の値を返します。 |
| IF.EAGER | IFと同じですが、常に両方の分岐を評価するeager実行プランを使用します。 |
| IFERROR | 式がエラーの場合、指定した値を返します。 |
| NOT | FALSEをTRUEに、TRUEをFALSEに変更します。 |
| OR | いずれかの引数がTRUEであるかを確認します。 |
| SWITCH | 値のリストに対して式を評価し、対応する結果を返します。 |
| TRUE | 論理値TRUEを返します。 |
数学・三角関数
四則演算の補助、丸め処理、三角関数などを扱います。DIVIDE(ゼロ除算対策つきの割り算)はとくに頻出です。
| 関数 | 説明 |
|---|---|
| ABS | 数値の絶対値を返します。 |
| ACOS | 数値のアークコサイン(逆余弦)を返します。 |
| ACOSH | 数値の双曲線逆余弦を返します。 |
| ACOT | 数値のアークコタンジェント(逆余接)を返します。 |
| ACOTH | 数値の逆双曲線余接を返します。 |
| ASIN | 数値のアークサイン(逆正弦)を返します。 |
| ASINH | 数値の双曲線逆正弦を返します。 |
| ATAN | 数値のアークタンジェント(逆正接)を返します。 |
| ATANH | 数値の逆双曲線正接を返します。 |
| CEILING | 最も近い整数または指定倍数に切り上げます。 |
| CONVERT | あるデータ型を別のデータ型に変換します。 |
| COS | 指定した角度のコサインを返します。 |
| COSH | 数値の双曲線コサインを返します。 |
| COT | ラジアン単位の角度のコタンジェントを返します。 |
| COTH | 双曲線余接を返します。 |
| CURRENCY | 引数を通貨データ型として返します。 |
| DEGREES | ラジアンを度に変換します。 |
| DIVIDE | ゼロ除算を安全に処理する除算を実行します。 |
| EVEN | 最も近い偶数に切り上げます。 |
| EXP | eの指定された数値乗を返します。 |
| FACT | 数値の階乗を返します。 |
| FLOOR | 最も近い基準値の倍数に切り捨てます。 |
| GCD | 2つ以上の整数の最大公約数を返します。 |
| INT | 最も近い整数に切り捨てます。 |
| ISO.CEILING | 最も近い整数または指定倍数に切り上げます。 |
| LCM | 整数の最小公倍数を返します。 |
| LN | 数値の自然対数を返します。 |
| LOG | 指定された底の対数を返します。 |
| LOG10 | 数値の常用対数を返します。 |
| MROUND | 指定倍数に丸めた数値を返します。 |
| ODD | 最も近い奇数に切り上げます。 |
| PI | 円周率の値を15桁の精度で返します。 |
| POWER | 数値を累乗した結果を返します。 |
| QUOTIENT | 除算結果の整数部分のみを返します。 |
| RADIANS | 角度をラジアンに変換します。 |
| RAND | 0以上1未満の乱数を返します。 |
| RANDBETWEEN | 指定範囲内の乱数を返します。 |
| ROUND | 数値を指定桁数に丸めます。 |
| ROUNDDOWN | 数値をゼロ方向に切り捨てます。 |
| ROUNDUP | 数値を切り上げます。 |
| SIGN | 数値の正負を調べます。 |
| SIN | 指定された角度のサインを返します。 |
| SINH | 数値の双曲線サインを返します。 |
| SQRT | 数値の平方根を返します。 |
| SQRTPI | (数値 x pi) の平方根を返します。 |
| TAN | 指定された角度のタンジェントを返します。 |
| TANH | 数値の双曲タンジェントを返します。 |
| TRUNC | 数値の小数部を切り捨てて整数に変換します。 |
統計関数
分布・順位・標準偏差など、統計処理に使う関数です。RANKXは売上ランキングなどの業務レポートでよく登場します。ExcelのRANK関数と用途は似ていますが、DAXではテーブル全体に対して評価する点が違います。
| 関数 | 説明 |
|---|---|
| BETA.DIST | ベータ分布を返します。 |
| BETA.INV | ベータ累積確率密度関数の逆関数を返します。 |
| CHISQ.DIST | カイ2乗分布を返します。 |
| CHISQ.DIST.RT | カイ2乗分布の右側確率を返します。 |
| CHISQ.INV | カイ2乗分布の左側確率の逆関数の値を返します。 |
| CHISQ.INV.RT | カイ2乗分布の右側確率の逆関数の値を返します。 |
| COMBIN | 指定された項目数の組み合わせの数を返します。 |
| COMBINA | 指定された項目数の組み合わせ(重複あり)の数を返します。 |
| CONFIDENCE.NORM | 正規分布を使用して、母集団の平均に対する信頼区間を返します。 |
| CONFIDENCE.T | 学生のT分布を使用して、信頼区間を返します。 |
| EXPON.DIST | 指数分布を返します。 |
| GEOMEAN | 列の数値の幾何平均を返します。 |
| GEOMEANX | テーブルの行ごとに評価される式の幾何平均を返します。 |
| LINEST | 線形回帰直線のパラメーターを返します。 |
| LINESTX | テーブルに対して線形回帰のパラメーターを返します。 |
| MEDIAN | 列の数値の中央値を返します。 |
| MEDIANX | テーブルの行ごとに評価される式の中央値を返します。 |
| NORM.DIST | 指定された平均と標準偏差の正規分布を返します。 |
| NORM.INV | 正規累積分布の逆数を返します。 |
| NORM.S.DIST | 標準正規分布を返します。 |
| NORM.S.INV | 標準正規累積分布の逆数を返します。 |
| PERCENTILE.EXC | 範囲内のk番目の百分位の値を返します(0と1を含まない)。 |
| PERCENTILE.INC | 範囲内のk番目の百分位の値を返します(0と1を含める)。 |
| PERCENTILEX.EXC | テーブルの行ごとに評価される式の百分位数を返します。 |
| PERCENTILEX.INC | テーブルの行ごとに評価される式の百分位数を返します。 |
| PERMUT | 指定された数から指定数を抜き取る順列の数を返します。 |
| POISSON.DIST | ポワソン分布を返します。 |
| RANK | 現在のコンテキストにおける値のランクを返します(2023年追加)。 |
| RANK.EQ | 数値のリストにおけるランク付けを返します。 |
| RANKX | テーブルの行別に数値のランキングを返します。 |
| ROWNUMBER | 現在の行の行番号を返します(2023年追加)。 |
| SAMPLE | テーブルからN行のサンプルを返します。 |
| STDEV.P | 母集団全体の標準偏差を返します。 |
| STDEV.S | サンプル母集団の標準偏差を返します。 |
| STDEVX.P | 母集団全体の標準偏差を返します。 |
| STDEVX.S | サンプル母集団の標準偏差を返します。 |
| T.DIST | 学生の左片側t分布を返します。 |
| T.DIST.2T | 学生の両側t分布を返します。 |
| T.DIST.RT | 学生の右片側t分布を返します。 |
| T.INV | 学生の左片側t分布の逆数を返します。 |
| T.INV.2T | 学生のt分布の両側逆関数を返します。 |
| VAR.P | 母集団全体の分散を返します。 |
| VAR.S | サンプル母集団の分散を返します。 |
| VARX.P | 母集団全体の分散を返します。 |
| VARX.S | サンプル母集団の分散を返します。 |
テーブル操作関数
テーブルの結合・列の追加・集約テーブルの作成などを行う関数です。SUMMARIZECOLUMNSはレポート作成の定番です。2023年以降はWINDOW・OFFSET・INDEXなど「ビジュアル計算」向けの関数も追加されています。
| 関数 | 説明 |
|---|---|
| ADDCOLUMNS | テーブルに計算列を追加します。 |
| ADDMISSINGITEMS | 複数の列から項目の組み合わせをテーブルに追加します。 |
| CROSSJOIN | すべてのテーブルのデカルト積を返します。 |
| CURRENTGROUP | GROUPBY式の行のセットを返します。 |
| DATATABLE | データ値のインラインセットを宣言します。 |
| DETAILROWS | メジャーの詳細行の式を評価してデータを返します。 |
| DISTINCT(列) | 指定された列の個別の値を含むテーブルを返します。 |
| DISTINCT(テーブル) | 重複する行を削除したテーブルを返します。 |
| EXCEPT | あるテーブルにあって別のテーブルにない行を返します。 |
| FILTERS | 列にフィルターとして適用されている値のテーブルを返します。 |
| GENERATE | 2つのテーブルのデカルト積を返します。 |
| GENERATEALL | 2つのテーブルのデカルト積を返します(空の結果を含む)。 |
| GENERATESERIES | 等差級数の値を含む単一列テーブルを返します。 |
| GROUPBY | グループ化されたサマリーテーブルを返します。 |
| IGNORE | SUMMARIZECOLUMNSの空白評価から特定の式を除外します。 |
| INDEX | 指定位置にある行を返します(2023年追加)。 |
| INTERSECT | 2つのテーブルの行の積集合を返します。 |
| NATURALINNERJOIN | 2つのテーブルの内部結合を実行します。 |
| NATURALLEFTOUTERJOIN | 2つのテーブルの左外部結合を実行します。 |
| OFFSET | 現在の行から相対位置の行を返します(2023年追加)。 |
| ORDERBY | WINDOW系関数で並び順を指定します(2023年追加)。 |
| PARTITIONBY | WINDOW系関数でパーティションを指定します(2023年追加)。 |
| ROLLUP | SUMMARIZE結果にロールアップ行を追加します。 |
| ROLLUPADDISSUBTOTAL | SUMMARIZECOLUMNS結果にロールアップ行を追加します。 |
| ROLLUPISSUBTOTAL | ロールアップグループとROLLUPADDISSUBTOTAL列をペアリングします。 |
| ROLLUPGROUP | SUMMARIZEおよびSUMMARIZECOLUMNS結果にロールアップ行を追加します。 |
| ROW | 1行のテーブルを返します。 |
| SELECTCOLUMNS | テーブルに計算列を追加します。 |
| SUBSTITUTEWITHINDEX | 2つのテーブルの左側の準順結合を返します。 |
| SUMMARIZE | グループごとのサマリーテーブルを返します。 |
| SUMMARIZECOLUMNS | グループに対するサマリーテーブルを返します。 |
| テーブルコンストラクター | 1つ以上の列からなるテーブルを返します。 |
| TOPN | テーブルの上位N行を返します。 |
| TREATAS | テーブル式の結果をフィルターとして適用します。 |
| UNION | 2つのテーブルの和集合を返します。 |
| VALUES | テーブルまたは列の個別の値を含むテーブルを返します。 |
| WINDOW | 指定したウィンドウの行セットを返します(2023年追加)。 |
リレーションシップ関数
テーブル間のリレーションシップを活用して、関連する値を取得したりクロスフィルターを制御したりする関数です。
| 関数 | 説明 |
|---|---|
| CROSSFILTER | リレーションシップのクロスフィルター処理の方向を指定します。 |
| RELATED | 別のテーブルから関連する値を返します。 |
| RELATEDTABLE | 指定されたフィルターでテーブル式を評価します。 |
| USERELATIONSHIP | 特定の計算で使用するリレーションシップを指定します。 |
情報関数
値の型チェックやフィルター状態の確認など、データの「状態を調べる」関数です。条件分岐と組み合わせて使うことが多いですよ。
| 関数 | 説明 |
|---|---|
| CONTAINS | すべての参照列に値が存在するかどうかを返します。 |
| CONTAINSROW | 値の行がテーブルに含まれているかを返します。 |
| CONTAINSSTRING | 文字列に別の文字列が含まれているかを返します。 |
| CONTAINSSTRINGEXACT | 大文字小文字を区別して文字列の包含を確認します。 |
| CUSTOMDATA | 接続文字列のCustomDataプロパティの内容を返します。 |
| HASONEFILTER | フィルター処理された値の数が1であるかを返します。 |
| HASONEVALUE | コンテキストが1つの個別の値のみにフィルター処理されているかを返します。 |
| ISAFTER | Start At句の動作をエミュレートします。 |
| ISBLANK | 値が空白であるかどうかを返します。 |
| ISCROSSFILTERED | 列がクロスフィルターされているかを返します。 |
| ISEMPTY | テーブルが空かどうかを調べます。 |
| ISERROR | 値がエラーであるかどうかを返します。 |
| ISEVEN | 数値が偶数であるかを返します。 |
| ISFILTERED | 列が直接フィルターされているかを返します。 |
| ISINSCOPE | 指定した列が階層のそのレベルであるかを返します。 |
| ISLOGICAL | 値が論理値であるかを返します。 |
| ISNONTEXT | 値が文字列以外であるかを返します。 |
| ISNUMBER | 値が数値であるかを返します。 |
| ISODD | 数値が奇数であるかを返します。 |
| ISONORAFTER | Start At句の動作をエミュレートします。 |
| ISSELECTEDMEASURE | コンテキスト内のメジャーがリスト内にあるかを判定します。 |
| ISSUBTOTAL | 行に小計値が含まれるかを返します。 |
| ISTEXT | 値が文字列であるかを返します。 |
| NONVISUAL | SUMMARIZECOLUMNS式の値フィルターを非ビジュアルとしてマークします。 |
| SELECTEDMEASURE | コンテキスト内のメジャーを参照します。 |
| SELECTEDMEASUREFORMATSTRING | メジャーの書式文字列を取得します。 |
| SELECTEDMEASURENAME | 名前でコンテキスト内のメジャーを調べます。 |
| USERNAME | ドメイン名とユーザー名を返します。 |
| USEROBJECTID | 現在のユーザーのオブジェクトIDを返します。 |
| USERPRINCIPALNAME | ユーザープリンシパル名を返します。 |
親子関数
組織図やBOM(部品表)のような親子階層データを扱う関数です。階層パスの取得や特定の位置の要素抽出ができます。
| 関数 | 説明 |
|---|---|
| PATH | 現在の識別子のすべての親の識別子を含むテキスト文字列を返します。 |
| PATHCONTAINS | 指定されたpath内にitemが存在するかを返します。 |
| PATHITEM | PATH関数の結果から指定した位置の項目を返します。 |
| PATHITEMREVERSE | PATH関数の結果から末尾基準で指定した位置の項目を返します。 |
| PATHLENGTH | PATHの結果内の自身を含めた親の数を返します。 |
財務関数
利率・減価償却・キャッシュフロー計算など、財務分析に使う関数です。Excelの財務関数とほぼ同じ名前・引数で使えます。
| 関数 | 説明 |
|---|---|
| ACCRINT | 定期的に利息が支払われる証券の利回りを返します。 |
| ACCRINTM | 満期に利息が支払われる証券の未払い利息を返します。 |
| AMORDEGRC | 各会計期間の減価償却費を返します(減価償却係数適用)。 |
| AMORLINC | 各会計期間の減価償却費を返します。 |
| COUPDAYBS | 利払期間の第1日目から受渡日までの日数を返します。 |
| COUPDAYS | 受渡日を含む利払期間の日数を返します。 |
| COUPDAYSNC | 受渡日から次の利払日までの日数を返します。 |
| COUPNCD | 受渡日後の次の利払日を返します。 |
| COUPNUM | 受渡日と満期日の間の利息支払回数を返します。 |
| COUPPCD | 受渡日直前の利払日を返します。 |
| CUMIPMT | 指定期間に貸付金に対して支払われる利息の累計を返します。 |
| CUMPRINC | 指定期間に貸付金に対して支払われる元金の累計を返します。 |
| DB | 定率法で資産の減価償却費を返します。 |
| DDB | 倍額定率法で資産の減価償却費を返します。 |
| DISC | 証券に対する割引率を返します。 |
| DOLLARDE | 分数表記のドル価格を10進数に変換します。 |
| DOLLARFR | 10進数のドル価格を分数表記に変換します。 |
| DURATION | マコーレー デュレーションを返します。 |
| EFFECT | 年間有効金利を返します。 |
| FV | 投資の将来価値を計算します。 |
| INTRATE | 全額投資された証券の利率を返します。 |
| IPMT | 指定された期に支払われる利息を返します。 |
| ISPMT | 元金均等払いで指定された期の利息を計算します。 |
| MDURATION | 修正されたマコーレー デュレーションを返します。 |
| NOMINAL | 年間名目金利を返します。 |
| NPER | 投資に対して期間数を返します。 |
| ODDFPRICE | 最初の期間が奇数の証券の額面100ドルあたりの価格を返します。 |
| ODDFYIELD | 最初の期間が奇数の証券の利回りを返します。 |
| ODDLPRICE | 最後の期間が奇数の証券の額面100ドルあたりの価格を返します。 |
| ODDLYIELD | 最後の期間が奇数の証券の利回りを返します。 |
| PDURATION | 投資が指定値に到達するまでの期間数を返します。 |
| PMT | ローンの支払額を算出します。 |
| PPMT | 投資の特定期間の元本の支払いを返します。 |
| PRICE | 利付債の額面100ドルあたりの価格を返します。 |
| PRICEDISC | 割引債の額面100ドルあたりの価格を返します。 |
| PRICEMAT | 満期利付債の額面100ドルあたりの価格を返します。 |
| PV | ローンまたは投資の現在価値を計算します。 |
| RATE | 年金の1期間あたりの利率を返します。 |
| RECEIVED | 満期日に支払われる金額を返します。 |
| RRI | 投資の増額に相当する利率を返します。 |
| SLN | 資産の定額減価償却費を返します。 |
| SYD | 級数法での資産の減価償却費を返します。 |
| TBILLEQ | 短期国債の債券換算利回りを返します。 |
| TBILLPRICE | 短期国債の額面100ドルあたりの価格を返します。 |
| TBILLYIELD | 短期国債の利回りを返します。 |
| VDB | 倍額定率法で特定期間の減価償却費を返します。 |
| XIRR | キャッシュフローの内部利益率を返します。 |
| XNPV | キャッシュフローの現在価値を返します。 |
| YIELD | 利付債の利回りを返します。 |
| YIELDDISC | 割引債の年利回りを返します。 |
| YIELDMAT | 満期利付債の年利回りを返します。 |
その他の関数
| 関数 | 説明 |
|---|---|
| BLANK | 空白を返します。 |
| ERROR | エラーを発生させ、エラーメッセージを生成します。 |
| EVALUATEANDLOG | デバッグ用に式の評価と中間結果を記録します。 |
業務シーン別:どのDAX関数を使えばいい?
一覧を見ても「結局どれを使えばいいの?」と迷うこともありますよね。ここではよくある業務シーンごとに、使う関数の組み合わせを紹介します。
月別・年別の売上合計を出したい
基本はSUMだけでOKです。Power BIの日付テーブルと組み合わせれば、月別・年別の集計はスライサーが自動で処理してくれます。
年度累計(YTD)を出したいときはTOTALYTDが便利です。
年度累計売上 = TOTALYTD(
SUM(売上[金額]),
カレンダー[Date]
)
Excel側で同じような累計を出す場合はSUMIFS関数で日付範囲を指定するやり方もあります。DAXの方がスライサーとの連携がスムーズです。
前年同期比を計算したい
SAMEPERIODLASTYEARを使えば、1年前の同じ期間の値を取れます。
前年売上 = CALCULATE(
SUM(売上[金額]),
SAMEPERIODLASTYEAR(カレンダー[Date])
)
前年比を出すなら、DIVIDEと組み合わせます。ゼロ除算も安全に処理してくれますよ。
前年比 = DIVIDE(
SUM(売上[金額]) - [前年売上],
[前年売上],
0
)
N期間ずらしたい場合はDATEADDを使ってみてください。月単位・四半期単位など柔軟に指定できます。
条件に合う行だけ集計したい
CALCULATEとFILTERの組み合わせが定番です。
大口売上 = CALCULATE(
SUM(売上[金額]),
FILTER(売上, 売上[金額] >= 500000)
)
単純な列の値での絞り込みなら、FILTERなしでもCALCULATEの引数に直接条件を書けます。
東京売上 = CALCULATE(
SUM(売上[金額]),
売上[地域] = "東京"
)
ExcelでいうCOUNTIFのように「条件に合う行数」を数えたいときは、COUNTROWSとFILTERを組み合わせてみてください。
東京件数 = COUNTROWS(
FILTER(売上, 売上[地域] = "東京")
)
構成比(パーセント)を計算したい
ALLで全体のフィルターを解除して、分母を作ります。
売上構成比 = DIVIDE(
SUM(売上[金額]),
CALCULATE(SUM(売上[金額]), ALL(売上[カテゴリ]))
)
ALLで「カテゴリ」列のフィルターだけを解除すると、各カテゴリが全体に占める割合が計算できます。スライサーの絞り込みを保持したい場合はALLSELECTEDを使ってみてください。
ランキング表示を作りたい
RANKX関数で順位を付けられます。売上上位から並べたいときに使います。
売上ランキング = RANKX(
ALL(売上[商品名]),
[売上合計],
,
DESC
)
第1引数にランキング対象のテーブル、第2引数に順位付けの基準メジャーを渡します。Excel側ではRANK関数を使いますが、DAXではテーブル全体に対してランクを付ける考え方になります。
条件分岐メジャーを作りたい
売上金額に応じたランク分け、達成率に応じたステータス表示など、条件分岐はSWITCHが定番です。
達成ステータス = SWITCH(TRUE(),
[達成率] >= 1.0, "達成",
[達成率] >= 0.9, "あと少し",
[達成率] >= 0.7, "要フォロー",
"要改善"
)
SWITCH(TRUE(), ...) 形式を使うと、IF文を何重もネストせずにすっきり書けます。ダッシュボードのステータス表示や、条件付き書式の判定に便利です。
在庫・KPIのしきい値判定を自動化したい
しきい値を超えた場合にアラートを出したい、在庫切れ警告を出したい、といった判定もDAXで書けます。
在庫アラート =
VAR _在庫数 = SUM(在庫[数量])
VAR _基準 = 10
RETURN
SWITCH(TRUE(),
_在庫数 = 0, "在庫切れ",
_在庫数 < _基準, "要発注",
"問題なし"
)
VAR / RETURN を使うと中間計算を名前付きで保持できます。Power BIのカードビジュアルやテーブルで、色分け付きのステータス列として表示できますよ。
DAX関数を学ぶときのコツ
DAXは奥が深い言語です。ここでは初心者がつまずきやすいポイントと、学習を進めるコツを整理しました。
フィルターコンテキストの理解が最優先
DAXでつまずく原因の多くは、フィルターコンテキストの理解不足です。スライサーで何かを選んだとき、ビジュアルで行ラベルを指定したとき、計算結果がどう変わるかを意識しましょう。
NOTE
CALCULATEは「フィルターコンテキストを上書きする」関数です。元のフィルターを完全に置き換えるわけではなく、条件を追加・変更する動きをします。ALLでフィルターを解除した状態に、新しい条件を足すこともできます。
計算列とメジャーの違いを知る
DAXには「計算列」と「メジャー」という2つの書き方があります。用途がまったく違うので、最初に区別しておきましょう。
| 項目 | 計算列(Calculated Column) | メジャー(Measure) |
|---|---|---|
| 計算タイミング | データ読み込み時に1回だけ | ビジュアル表示のたびに動的に |
| コンテキスト | 行コンテキスト | フィルターコンテキスト |
| メモリ消費 | 大きい(列として保存) | 小さい(結果のみ) |
| 向いている用途 | 「単価 × 数量」のような行単位の値 | 「売上合計」「前年比」などの集計値 |
| スライサーで使えるか | 使える(カテゴリ列化できる) | 直接は使えない |
迷ったらメジャーを使うのが基本です。計算列は「行ごとに値を固定したい」場合や、スライサーやフィルターで使う列が必要な場合だけ使います。
VAR / RETURN でコードを読みやすくする
同じ式を何度も使う長いメジャーは、VAR / RETURN を使うとパフォーマンス・可読性ともに向上します。
前年比成長 =
VAR _当期 = SUM(売上[金額])
VAR _前年 = CALCULATE(SUM(売上[金額]), SAMEPERIODLASTYEAR(カレンダー[Date]))
VAR _差分 = _当期 - _前年
RETURN
DIVIDE(_差分, _前年, 0)
VARで定義した変数は1度だけ評価され、再利用されます。DIVIDEの中で同じメジャーを2回呼び出すより計算コストが下がりますよ。デバッグで中間値を確認したいときにも便利です。
TIP
複雑なメジャーを書くときは、各 VAR を段階的に追加してデバッグしましょう。RETURN _中間値で一時的に戻り値を変えれば、途中計算の値が確認できます。
エラーが出たときの調べ方
DAXでよく遭遇するエラーを4つまとめました。
| エラー | 主な原因 | 対処方法 |
|---|---|---|
| 循環依存関係が検出されました | 計算列が自テーブルをCALCULATEで参照している | メジャーに変更する、USERELATIONSHIPを使う |
| The expression refers to multiple columns | 単一値を期待する場所に複数の値を渡している | SELECTEDVALUEやVALUESで単一値に変換する |
| A function expected a table | テーブル引数に列を渡している | VALUES(列)やDISTINCT(列)でテーブル化する |
| A single value for column ‘X’ cannot be determined | 行コンテキストなしで列を直接参照した | CALCULATEでラップする、または明示的な集計関数で包む |
エラーメッセージは一見むずかしそうに見えます。しかし「値を1つ期待されている」「テーブルを期待されている」など、型の不一致であることがほとんどです。引数の型を見直すだけで解決することが多いですよ。
覚える順番のおすすめ
学習効率を考えた順番です。
- 基本集計: SUM、AVERAGE、COUNTなど
- CALCULATE: 条件付き集計の基本パターン
- DIVIDE / SWITCH: ゼロ除算対策と条件分岐
- リレーションシップ関数: RELATED、RELATEDTABLE
- タイムインテリジェンス: SAMEPERIODLASTYEAR、TOTALYTD
- X系関数: SUMX、AVERAGEX、RANKX
- テーブル操作: FILTER、ALL、SUMMARIZE
- VAR / RETURN: パフォーマンスとデバッグ
この順番で覚えていくと、業務レポートの大半はカバーできます。
DAX関数学習におすすめのリソース
DAXは情報の更新が速い言語です。公式ドキュメントとツールを活用しましょう。
Microsoft Learn公式ドキュメント
- 機能別関数リファレンス: 各関数の構文・引数・戻り値・使用例が網羅されています
- 日本語版あり。機能別のカテゴリページから目的の関数を探せます
- 困ったらまずはここを参照する習慣をつけましょう
DAX Studio(無料ツール)
DAX Studio は無料のオープンソース開発ツールです。以下のことができます。
- メジャーやDAXクエリを書いて即座に実行
- パフォーマンス計測(どこで時間がかかっているか分析)
- Power BI デスクトップや Excel パワーピボットに接続
- メジャー定義の一覧表示・編集
本格的にDAXを書くなら、Power BI Desktopと併用して必ず入れておきたいツールです。
学習ルートのおすすめ
- Power BI Desktopをインストールして、サンプルデータでメジャーを試す
- Microsoft Learnの「Power BI入門」コースで基礎を学ぶ
- 本記事で紹介した7関数を実際のデータで試す
- 業務シーン別のメジャーを1つずつ作り、スライサーで動作確認する
- DAX Studioでパフォーマンスを確認する習慣を身につける
よくある質問(FAQ)
Q. DAX関数はExcel関数と同じものですか?
名前が似ている関数は多いですが、別物です。DAXはテーブルと列を参照する仕組みで、セル参照のExcel関数とは考え方が異なります。たとえばSUMは名前こそ同じですが、DAXではSUM(売上[金額])のように列名で指定します。
Q. DAXはどこで使えますか?
主にPower BI Desktop、Excelのパワーピボット、SQL Server Analysis Services、Azure Analysis Servicesで使えます。ふつうのExcelのセルに入力しても動きません。Excelでは「データ」タブから「データモデルに追加」したテーブルに対して、メジャーや計算列として使います。
Q. CALCULATEが難しくて使いこなせません
ちょっとむずかしく見えますが、やっていることはシンプルです。「この条件のときだけ計算してね」とフィルターを指定しているだけです。まずはCALCULATE(SUM(...), 条件)の形で試してみてください。
Q. CALCULATEとCALCULATETABLEの違いは?
CALCULATEは単一の値(スカラー値)を返します。CALCULATETABLEはテーブルを返します。メジャーの中で使うならCALCULATE、サブクエリ的にテーブルを作るならCALCULATETABLEです。
Q. ExcelのVLOOKUPに相当するDAX関数は?
リレーションシップが設定済みならRELATED、未設定ならLOOKUPVALUEを使います。Power BIではリレーションシップを使うのが基本なので、RELATEDのほうが出番は多いですよ。Excel側のVLOOKUP関数と対応させて覚えると、使い分けが早く身につきます。
Q. VAR / RETURN はいつ使えばいいですか?
同じ式を複数回使う場合、または複雑な計算でデバッグしたい場合に使います。VARで定義した変数は1度だけ評価されるため、パフォーマンスも上がります。メジャーが5行を超えるなら、VAR / RETURN で分けて書くのが読みやすくなりますよ。
Q. 2023年以降に追加されたDAX関数にはどんなものがありますか?
WINDOW・OFFSET・INDEX・ORDERBY・PARTITIONBYなどのウィンドウ関数が追加されました。ビジュアル計算(Visual Calculations)機能と組み合わせて使うと、前期比・累計・移動平均などが今までよりシンプルに書けます。EVALUATEANDLOGというデバッグ関数も便利です。
Q. DAX関数の公式リファレンスはどこで見られますか?
Microsoft Learnの公式サイトに、機能別のDAX関数リファレンスが掲載されています。関数ごとの構文・引数・戻り値・使用例が確認できます。日本語版もあるので、引数の仕様で迷ったときはぜひ参照してください。
まとめ
DAX関数は200以上ありますが、日常的に使うのはそのうちの一部です。まずはこの7つから始めてみてください。
- CALCULATE: 条件付き集計の要
- SUMX: 行ごとの計算と合計
- FILTER: データの絞り込み
- ALL: フィルター解除で構成比計算
- RELATED: テーブルをまたいだ値の取得
- DIVIDE: ゼロ除算を安全に処理
- SWITCH: 条件分岐をすっきり書く
慣れてきたら、タイムインテリジェンス関数(SAMEPERIODLASTYEARやTOTALYTDなど)や、VAR / RETURN による変数定義にも挑戦してみてください。前年比や累計といった、ビジネスレポートに欠かせない計算がぐっとラクになりますよ。
Excel関数の復習にはExcel関数一覧(機能別)やExcel関数一覧(アルファベット順)も参考になります。DAXとExcel関数を行き来しながら、データ分析の引き出しを増やしていきましょう。
