Power BIチートシート
最終更新
メジャー、列、テーブル
メジャーはビジュアルのセルごとに計算されます。計算列は行ごとに一度だけ計算され、保存されます。
| 用途 | DAX |
|---|---|
| メジャーを作る | Total Sales = SUM ( Sales[Amount] ) |
| 計算列を作る(行ごとに1つの値) | Line Total = Sales[Quantity] * Sales[Unit Price] |
| 計算テーブルを作る | Top Customers = TOPN ( 10, Customer, [Total Sales] ) |
| 列を参照する:テーブル名のあとに、角かっこで囲んだ列名 | Sales[Amount] |
| スペースを含むテーブル名や予約語のテーブル名を引用符で囲む | 'Date'[Date] |
| メジャーを参照する:角かっこだけ | [Total Sales] |
| メジャーを別のメジャーの中で使う | Average Price = DIVIDE ( [Total Sales], [Total Units] ) |
集計関数
どれも、現在のフィルター コンテキストで列を集計します。
| 用途 | DAX |
|---|---|
| 列を合計する | SUM ( Sales[Amount] ) |
| 列の平均 | AVERAGE ( Sales[Amount] ) |
| 最小値 | MIN ( Sales[Order Date] ) |
| 最大値 | MAX ( Sales[Order Date] ) |
| テーブルの行数を数える | COUNTROWS ( Sales ) |
| 列の空白でない値を数える | COUNT ( Sales[Amount] ) |
| 重複しない値を数える | DISTINCTCOUNT ( Sales[Customer Key] ) |
| 安全に割る:分母が0のときはエラーではなく空白 | DIVIDE ( [Total Sales], [Total Units] ) |
| 分母が0のときに表示する値を指定して割る | DIVIDE ( [Profit], [Total Sales], 0 ) |
反復子(Xで終わる関数)
テーブルを1行ずつたどって行ごとに式を評価し、その結果を集計します。
| 用途 | DAX |
|---|---|
| 行ごとに掛けてから合計する | SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| 行ごとの結果の平均 | AVERAGEX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| 行ごとの結果の最大値 | MAXX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| 顧客ごとのメジャーの平均 | AVERAGEX ( VALUES ( Customer[Customer Key] ), [Total Sales] ) |
| 関連テーブルの列を式の中で使う | SUMX ( Sales, Sales[Quantity] * RELATED ( Product[Unit Cost] ) ) |
| 条件を満たす行を数える | COUNTROWS ( FILTER ( Sales, Sales[Quantity] >= 3 ) ) |
| すべての製品をメジャーで順位付けする | RANKX ( ALL ( Product[Product] ), [Total Sales] ) |
| 同順位のあとを詰めて順位付けする(1, 1, 2) | RANKX ( ALL ( Product[Product] ), [Total Sales], , DESC, DENSE ) |
| 値をつないで1つのテキストにする | CONCATENATEX ( VALUES ( Product[Category] ), Product[Category], ", " ) |
CALCULATEとフィルター関数
CALCULATEはフィルターを変えて式を評価します。同じ列へのフィルターは元のフィルターを置き換え、別の列へのフィルターはANDで組み合わされます。
| 用途 | DAX |
|---|---|
| 1つの値で絞り込む | CALCULATE ( [Total Sales], Product[Category] = "Bikes" ) |
| 値のリストで絞り込む | CALCULATE ( [Total Sales], Product[Color] IN { "Red", "Blue" } ) |
| 2つのフィルター(AND) | CALCULATE ( [Total Sales], Product[Color] = "Red", Store[Country] = "Spain" ) |
| 2つの列にまたがるOR | CALCULATE ( [Total Sales], FILTER ( ALL ( Product[Color], Product[Brand] ), Product[Color] = "Red" || Product[Brand] = "Contoso" ) ) |
| メジャーで絞り込む | CALCULATE ( [Total Sales], FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) ) |
| 既存のフィルターを残し、それと交差させる | CALCULATE ( [Total Sales], KEEPFILTERS ( Product[Color] IN { "Red", "Blue" } ) ) |
| 列のフィルターを解除する | CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) |
| テーブルのフィルターをすべて解除する | CALCULATE ( [Total Sales], ALL ( Product ) ) |
| 一部の列を除いて、テーブルのフィルターをすべて解除する | CALCULATE ( [Total Sales], ALLEXCEPT ( Store, Store[Country] ) ) |
| スライサーの選択は残し、ビジュアル自体の行によるフィルターは外す | CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) |
| 非アクティブなリレーションシップを使う | CALCULATE ( [Total Sales], USERELATIONSHIP ( Sales[Ship Date], 'Date'[Date] ) ) |
| 1つのメジャーの中だけでフィルターを双方向に伝える | CALCULATE ( COUNTROWS ( Customer ), CROSSFILTER ( Sales[Customer Key], Customer[Customer Key], BOTH ) ) |
| リレーションシップのないテーブルで絞り込む | CALCULATE ( [Total Sales], TREATAS ( VALUES ( Budget[Category] ), Product[Category] ) ) |
タイム インテリジェンス
日付テーブルが必要です。1日1行で抜けがなく、日付テーブルとしてマークされたテーブルです。
| 用途 | DAX |
|---|---|
| 年初来の累計 | TOTALYTD ( [Total Sales], 'Date'[Date] ) |
| 年初来の累計(6月30日締めの会計年度) | TOTALYTD ( [Total Sales], 'Date'[Date], "6/30" ) |
| CALCULATEの中で年初来の累計 | CALCULATE ( [Total Sales], DATESYTD ( 'Date'[Date] ) ) |
| 四半期初来の累計 | TOTALQTD ( [Total Sales], 'Date'[Date] ) |
| 月初来の累計 | TOTALMTD ( [Total Sales], 'Date'[Date] ) |
| 前年同期 | CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) |
| 日付を一定の間隔だけずらす(ここでは1か月前) | CALCULATE ( [Total Sales], DATEADD ( 'Date'[Date], -1, MONTH ) ) |
| 前月全体 | CALCULATE ( [Total Sales], PREVIOUSMONTH ( 'Date'[Date] ) ) |
| 1年前の期間全体 | CALCULATE ( [Total Sales], PARALLELPERIOD ( 'Date'[Date], -1, YEAR ) ) |
| 最後に表示される日付までの直近12か月 | CALCULATE ( [Total Sales], DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH ) ) |
| 固定の日付範囲 | CALCULATE ( [Total Sales], DATESBETWEEN ( 'Date'[Date], DATE ( 2025, 1, 1 ), DATE ( 2025, 3, 31 ) ) ) |
よく使うメジャーのパターン
コピーしてから、テーブル名と列名を自分のモデルに合わせて変えてください。
| 用途 | DAX |
|---|---|
| 全カテゴリに対する割合 | Category % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) ) |
| スライサーで残った範囲に対する割合 | Visible % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) ) |
| 前年比の伸び率 | YoY % = VAR LastYear = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN DIVIDE ( [Total Sales] - LastYear, LastYear ) |
| 全期間の累計 | Running Total = CALCULATE ( [Total Sales], FILTER ( ALL ( 'Date'[Date] ), 'Date'[Date] <= MAX ( 'Date'[Date] ) ) ) |
| 7日間の移動平均(売上のある日ごと) | Sales 7 Day Avg = AVERAGEX ( DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -7, DAY ), [Total Sales] ) |
| 上位5件だけに値を表示する | Top 5 Sales = IF ( RANKX ( ALLSELECTED ( Product[Product] ), [Total Sales] ) <= 5, [Total Sales] ) |
| しきい値を超える顧客を数える | Big Customers = COUNTROWS ( FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) ) |
| 合計を行の値の合計と一致させる | Bonus Total = SUMX ( VALUES ( Product[Category] ), [Bonus] ) |
| マトリックスの1つのレベルだけに値を表示する | Category Rank = IF ( ISINSCOPE ( Product[Category] ), RANKX ( ALL ( Product[Category] ), [Total Sales] ) ) |
| 期末残高:値がある最後の日付 | Closing Units = CALCULATE ( SUM ( Inventory[Units] ), LASTNONBLANK ( 'Date'[Date], CALCULATE ( SUM ( Inventory[Units] ) ) ) ) |
論理関数と情報関数
条件の判定と、フィルター コンテキストに何が残っているかを調べるための関数です。
| 用途 | DAX |
|---|---|
| 条件が1つ | IF ( [Total Sales] > 1000, "High", "Low" ) |
| 1つの式がとる複数の値 | SWITCH ( Store[Country], "Spain", "ES", "Portugal", "PT", "Other" ) |
| 範囲を上から順に判定する | SWITCH ( TRUE (), [Total Sales] >= 10000, "A", [Total Sales] >= 1000, "B", "C" ) |
| ANDとOR | IF ( Sales[Quantity] > 2 && Sales[Amount] > 50, "Big", "Small" ) |
| 値は空白か | ISBLANK ( [Total Sales] ) |
| 空白でない最初の値 | COALESCE ( [Total Sales], 0 ) |
| フィルターで値がちょうど1つに絞られているか | HASONEVALUE ( Product[Category] ) |
| その1つの値、またはそうでなければ既定値 | SELECTEDVALUE ( Product[Category], "All categories" ) |
| ビジュアルのこの行は、その列でグループ化されているか | ISINSCOPE ( Product[Category] ) |
| 空白を返す | BLANK () |
テキスト関数
&演算子はテキストをつなぎ、FORMATは数値や日付をテキストに変えます。
| 用途 | DAX |
|---|---|
| テキストをつなぐ | Customer[First Name] & " " & Customer[Last Name] |
| 数値の書式を設定する | FORMAT ( [Total Sales], "#,0.00" ) |
| 日付の書式を設定する | FORMAT ( 'Date'[Date], "mmm yyyy" ) |
| 先頭の文字 | LEFT ( Product[Code], 3 ) |
| 指定した位置からの文字 | MID ( Product[Code], 4, 2 ) |
| 文字数 | LEN ( Product[Name] ) |
| 大文字にする | UPPER ( Store[City] ) |
| 余分なスペースを削除する | TRIM ( Customer[Name] ) |
| テキストを置き換える | SUBSTITUTE ( Customer[Phone], " ", "" ) |
| 大文字と小文字を区別せずにテキストの位置を探す(見つからなければ0) | SEARCH ( "pro", Product[Name], 1, 0 ) |
日付関数
日付の中身は数値なので、引き算すると日数になります。
| 用途 | DAX |
|---|---|
| 今日の日付 | TODAY () |
| 日付を作る | DATE ( 2025, 12, 31 ) |
| 日付の年 | YEAR ( 'Date'[Date] ) |
| 月の番号 | MONTH ( 'Date'[Date] ) |
| 曜日(月曜日が1) | WEEKDAY ( 'Date'[Date], 2 ) |
| 週番号(週の始まりは月曜日) | WEEKNUM ( 'Date'[Date], 2 ) |
| 月末日 | EOMONTH ( 'Date'[Date], 0 ) |
| 1か月前の同じ日 | EDATE ( 'Date'[Date], -1 ) |
| 2つの日付の間の日数 | DATEDIFF ( Sales[Order Date], Sales[Ship Date], DAY ) |
| 固定の日付から日付テーブルを作る | CALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) ) |
| モデル内の日付から日付テーブルを作る | CALENDARAUTO () |
リレーションシップと検索
RELATEDは、リレーションシップを多の側から一の側へたどります。
| 用途 | DAX |
|---|---|
| 一の側の値(Salesの列で) | RELATED ( Product[Category] ) |
| 現在の行に対応する多の側の行(Customerの列で) | COUNTROWS ( RELATEDTABLE ( Sales ) ) |
| リレーションシップなしで値を検索する | LOOKUPVALUE ( Product[Price], Product[SKU], Sales[SKU] ) |
| 親子のパス(階層と行レベル セキュリティ用) | PATH ( Employee[Employee ID], Employee[Manager ID] ) |
| サインインしているユーザー(動的な行レベル セキュリティ用) | USERPRINCIPALNAME () |
テーブル関数
テーブルを返す関数です。計算テーブル、CALCULATEの中、反復子の中で使います。
| 用途 | DAX |
|---|---|
| 現在のフィルターでの重複しない値 | VALUES ( Product[Category] ) |
| 条件を満たす行 | FILTER ( Product, Product[Price] > 100 ) |
| メジャーで上位N行 | TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) |
| 列でグループ化してメジャーを加える | SUMMARIZECOLUMNS ( Product[Category], "Sales", [Total Sales] ) |
| テーブルに列を追加する | ADDCOLUMNS ( VALUES ( Product[Category] ), "Sales", [Total Sales] ) |
| 列を選んで名前を変える | SELECTCOLUMNS ( Customer, "Name", Customer[Name], "City", Customer[City] ) |
| 数値のリスト | GENERATESERIES ( 1, 10, 1 ) |
| 2つのテーブルのすべての組み合わせ | CROSSJOIN ( VALUES ( 'Date'[Year] ), VALUES ( Product[Category] ) ) |
| 同じ列を持つ2つのテーブルを縦に積む | UNION ( 'Sales 2024', 'Sales 2025' ) |
変数
VARはステップに名前を付けて一度だけ計算し、RETURNが結果を返します。
| 用途 | DAX |
|---|---|
| 変数が1つ | Margin % = VAR Revenue = [Total Sales] RETURN DIVIDE ( Revenue - [Total Cost], Revenue ) |
| 変数が複数 | Sales vs LY = VAR CY = [Total Sales] VAR PY = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN CY - PY |
| 変数にテーブルを入れる | Top 5 Total = VAR Top5 = TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) RETURN CALCULATE ( [Total Sales], Top5 ) |
Power Query(M)のステップ
Power Queryは読み込む前にデータを整えます。よく使うボタンの裏で動いているMの数式です。
| 用途 | M |
|---|---|
| 条件に合う行を残す | Table.SelectRows(Source, each [Status] = "Paid") |
| 列を削除する | Table.RemoveColumns(Source, {"Notes", "Temp"}) |
| 列のデータ型を設定する | Table.TransformColumnTypes(Source, {{"Amount", type number}, {"Date", type date}}) |
| 列の名前を変更する | Table.RenameColumns(Source, {{"amt", "Amount"}}) |
| 列を追加する | Table.AddColumn(Source, "Total", each [Quantity] * [Price], type number) |
| 2つのクエリをマージ(結合)する | Table.NestedJoin(Sales, {"ProductID"}, Products, {"ProductID"}, "Product", JoinKind.LeftOuter) |
| クエリを追加(縦に結合)する | Table.Combine({Sales2024, Sales2025}) |
| 列のピボットを解除して行にする | Table.UnpivotOtherColumns(Source, {"Product"}, "Month", "Amount") |
| グループ化して集計する | Table.Group(Source, {"Category"}, {{"Sales", each List.Sum([Amount]), type number}}) |
| エラーを値で置き換える | Table.ReplaceErrorValues(Source, {{"Amount", 0}}) |
このPower BIチートシートは、よく書くDAXを1ページにまとめたものです。集計、Xで終わる反復子、CALCULATEとフィルターを変える関数、タイム インテリジェンス、テキスト関数と日付関数、そして全体に対する割合、前年比の伸び率、累計のような、そのままコピーできるメジャーのパターンを載せています。
例ではSales、Product、Customerと'Date'テーブルを持つ売上モデルを使っています。テーブル名は自分のモデルに合わせて変えてください。ここにあるDAXはすべて、CoddyのPower BIコースで使っているエンジンで構文を確認しています。コースでは、ブラウザのPower BIワークスペースでDAXを書いてチェックを受けられます。
Power BIチートシートのよくある質問
このPower BIチートシートは無料ですか?
はい。このページで読むことも、ブックマークしておくこともできます。登録は不要です。
メジャーと計算列の違いは何ですか?
計算列は更新時に行ごとに一度計算されて保存されるので、その列でデータを切り分けられます。メジャーはビジュアルのセルごとに、そのセルのフィルターで計算され、何も保存しません。合計や比率はメジャーで書きます。
CALCULATEは何をしますか?
フィルターを変えて式を評価します。フィルターを追加、置き換え、解除してから結果を計算します。単純な合計より先のDAXは、ほとんどが適切なフィルター引数を渡したCALCULATEです。
/演算子ではなくDIVIDEを使うのはなぜですか?
DIVIDEは、分母が0または空白のときに空白(または指定した値)を返します。/演算子は代わりに無限大やエラー値を返し、それがビジュアルにそのまま表示されます。タイム インテリジェンスには日付テーブルが必要ですか?
TOTALYTDやSAMEPERIODLASTYEARなどの関数には、1日1行で抜けがなく、年単位でそろったテーブルが必要です。ファクト テーブルとリレーションシップでつなぎ、日付テーブルとしてマークしてください。このDAXはExcelのPower PivotやAnalysis Servicesでも使えますか?
DAXは共通の言語なので、ほぼすべてそのまま使えます。新しい関数のいくつかは、先にPower BIに追加されます。
DAXはどこで練習できますか?
CoddyのPower BIコースで練習できます。各レッスンでブラウザのPower BIワークスペースが開き、書いたメジャーをレッスンのデータとその隠しコピーでチェックします。