Menu
CoddyTech

Power BIチートシート

最終更新

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つの列にまたがるORCALCULATE ( [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とORIF ( 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ワークスペースが開き、書いたメジャーをレッスンのデータとその隠しコピーでチェックします。

Coddyのプログラミング言語のイラスト

CoddyでPower BIを学ぼう

始める