Data Analytics & BIシリーズの一部
完全ガイドを読むすべてのビジネス ユーザーが知っておくべき DAX 式
DAX (Data Analysis Expressions) は、Power BI を単純なグラフ作成ツールから本格的な分析エンジンに変換する数式言語です。 Power BI のドラッグ アンド ドロップ インターフェイスは基本的な集計を処理しますが、実際のビジネス インテリジェンスには DAX が必要です。前年比比較、移動平均、ランキング、仮定のシナリオ、複雑な KPI はすべて DAX の数式に依存します。
課題は、DAX は一見シンプルに見えますが、経験豊富な Excel ユーザーさえも驚くような動作をすることです。フィルター コンテキスト、行コンテキスト、およびコンテキスト遷移の概念は DAX に固有であり、Excel や SQL には直接同等のものはありません。このガイドでは、ビジネス ユーザー向けの 20 の最も実用的な DAX 式に焦点を当てており、すぐに適応できる実際の例も含まれています。
重要なポイント
- CALCULATE は最も重要な DAX 関数です --- これはフィルター コンテキストを変更し、重要なメジャーの 80% 以上で使用されます
- タイム インテリジェンス関数 (TOTALYTD、SAMEPERIODLASTYEAR、DATEADD) には、モデル内でそのようにマークされている適切な日付テーブルが必要です
- VAR/RETURN 構文により、複雑なメジャーが読みやすくなり、冗長な計算が回避されます
- イテレータ関数 (SUMX、AVERAGEX、RANKX) は式を行ごとに評価し、集計関数 (SUM、AVERAGE) は列を操作します。
- コンテキスト遷移は、計算列またはイテレータがメジャーを呼び出すときに発生し、行コンテキストをフィルターコンテキストに変換します。
- SWITCH(TRUE(), ...) はネストされた IF ステートメントを置き換え、はるかに読みやすくなります。
- ALL、ALLEXCEPT、および REMOVEFILTERS はどのフィルタをアクティブにするかを制御します --- ただし、RLS への影響には注意してください
基礎: フィルター コンテキストと行コンテキスト
公式に入る前に、これら 2 つの概念を理解することが不可欠です。 DAX におけるすべての混乱は、フィルター コンテキストと行コンテキストに遡ります。
フィルターコンテキスト
フィルター コンテキストは、計算に適用されるフィルターのセットです。これは、スライサー、ビジュアル フィルター、ページ フィルター、レポート フィルター、および RLS から取得されます。行に「年」、列に「地域」を含むマトリックス ビジュアルにメジャーを配置すると、各セルに固有のフィルター コンテキスト (年 = 2025、地域 = 北アメリカ)、(年 = 2025、地域 = EMEA) などが設定されます。
すべての DAX 集計関数 (SUM、AVERAGE、COUNT、MIN、MAX) は、現在のフィルター コンテキスト内で評価されます。 2025 + 北アメリカにフィルター処理されたセルの SUM(Sales[Revenue]) は、両方の条件に一致する収益行のみを合計します。
行コンテキスト
行コンテキストは計算列とイテレータ関数の内部に存在します。 「現在の行」を意味します。 Sales テーブルの計算列では、Sales[Revenue] * Sales[Quantity] が各行を個別に評価します。
コンテキストの遷移
反復関数 (SUMX など) がメジャーを呼び出すと、行コンテキストがフィルター コンテキストに自動的に変換されます。これをコンテキスト遷移と呼びます。これは強力ですが、誤用するとパフォーマンスの問題の原因となる可能性があります。
-- Row context exists here (iterating over Products)
Revenue Per Product =
SUMX(
Products,
[Total Revenue] -- This measure is evaluated in filter context
-- where the current product's ID filters the Sales table
)
これらの概念を理解すると、すべての DAX 式が直感的に使用できるようになります。これらがないと、DAX 式はブラック ボックスのように感じられます。
20 の必須公式
1. CALCULATE — フィルターコンテキストの変更
CALCULATE は最も重要な DAX 関数です。変更されたフィルター コンテキストで式を評価します。
構文: CALCULATE(expression, filter1, filter2, ...)
例: 大量注文からの収益のみ
Large Order Revenue =
CALCULATE(
SUM(Sales[Revenue]),
Sales[OrderTotal] > 10000
)
例: 特定の製品カテゴリからの収益
Electronics Revenue =
CALCULATE(
SUM(Sales[Revenue]),
Products[Category] = "Electronics"
)
CALCULATE は、指定された列の既存のフィルターを置き換えます。スライサーがすでにカテゴリを「衣料品」にフィルターしている場合、CALCULATE がカテゴリ フィルターをオーバーライドするため、エレクトロニクス収益メジャーはそのスライサーを無視し、エレクトロニクス収益を表示します。
2. FILTER — 行レベルのフィルタリング
FILTER は、条件によってフィルタリングされたテーブルを返します。これは、単純な列比較として表現できない複雑なフィルタリングのために CALCULATE 内でよく使用されます。
構文: FILTER(table, condition)
例: 5 件以上の注文がある顧客からの収益
Revenue From Repeat Customers =
CALCULATE(
SUM(Sales[Revenue]),
FILTER(
Customers,
CALCULATE(COUNTROWS(Sales)) > 5
)
)
重要: FILTER は行ごとに反復処理を行うため、大きなテーブルでは単純な CALCULATE フィルターよりも遅くなります。ダイレクトカラムフィルターでは不十分な場合にのみ使用してください。
3. ALL — すべてのフィルターを削除します
ALL は、テーブルまたは列からすべてのフィルターを削除し、フィルターされていない完全なテーブルを返します。合計、合計に対するパーセンテージ、比率を計算するために使用されます。
構文: ALL(table) または ALL(table[column])
例: 合計に占める収益の割合
Revenue % of Total =
DIVIDE(
SUM(Sales[Revenue]),
CALCULATE(SUM(Sales[Revenue]), ALL(Sales))
)
スライサーが「北米」にフィルターすると、SUM(Sales[Revenue]) は北米の収益を返します。 CALCULATE(SUM(Sales[Revenue]), ALL(Sales)) はすべてのフィルターを削除し、グローバル収益を返します。除算によりパーセンテージが得られます。
4. ALLEXCEPT — 指定されたフィルターを除くすべてのフィルターを削除します
ALLEXCEPT は、指定された列を除くすべてのフィルターをテーブルから削除します。これは、一部のフィルタ (年など) を保持し、他のフィルタ (製品カテゴリなど) を削除したい場合に便利です。
構文: ALLEXCEPT(table, column1, column2, ...)
例: 当年度内の収益シェア
Revenue % of Year Total =
DIVIDE(
SUM(Sales[Revenue]),
CALCULATE(
SUM(Sales[Revenue]),
ALLEXCEPT(Sales, DateTable[Year])
)
)
これは、全期間ではなく、選択した年内の各製品または地域の収益の割合を示します。
5. TOTALYTD — 年初から現在まで
TOTALYTD は、コンテキストに基づいて、年の初めから現在の日付までの累計を計算します。
構文: TOTALYTD(expression, dates[date_column], [filter], [year_end_date])
例: 年初から現在までの収益
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])
6月30日に終了する会計年度の場合:
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "6/30")
前提条件: DateTable はモデル内で日付テーブルとしてマークされている必要があります ([テーブル ツール]、[日付テーブルとしてマーク])。
6. 昨年同時期 — 前年比
SAMEPERIODLASTYEAR は、日付コンテキストをちょうど 1 年前に戻します。
構文: SAMEPERIODLASTYEAR(dates[date_column])
例: 昨年との収益の比較
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), SAMEPERIODLASTYEAR(DateTable[Date]))
Revenue YoY Growth =
VAR CurrentRevenue = SUM(Sales[Revenue])
VAR PriorRevenue = [Revenue PY]
RETURN
DIVIDE(CurrentRevenue - PriorRevenue, PriorRevenue, 0)
月次マトリックスの各行には、当月の収益と前年同月の収益が成長率とともに表示されます。
7. DATEADD — 柔軟なタイムシフト
DATEADD は、日、月、四半期、年などの任意の間隔で日付をシフトします。 SAMEPERIODLASTYEAR よりも柔軟です。
構文: DATEADD(dates[date_column], intervals, interval_type)
例: 3 か月前の収益
Revenue 3 Months Ago =
CALCULATE(
SUM(Sales[Revenue]),
DATEADD(DateTable[Date], -3, MONTH)
)
例: 12 か月のローリング収益
Revenue Rolling 12M =
CALCULATE(
SUM(Sales[Revenue]),
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)
8. RANKX — 動的ランキング
RANKX は、式に基づいて各アイテムにランキングを割り当てます。
構文: RANKX(table, expression, [value], [order], [ties])
例: 収益別に製品をランク付けします
Product Revenue Rank =
RANKX(
ALL(Products[ProductName]),
[Total Revenue],
,
DESC,
DENSE
)
ALL(Products[ProductName]) は、製品のスライサー フィルターに関係なく、ランク付けの対象となる製品の完全なリストを提供します。 DESC は、最も高い収益がランク 1 になることを意味します。DENSE は、同点の値が同じランクになることを意味します。
例: トップ N フィルター
Top 10 Products Revenue =
CALCULATE(
[Total Revenue],
FILTER(
ALL(Products[ProductName]),
RANKX(ALL(Products[ProductName]), [Total Revenue], , DESC) <= 10
)
)
9. SWITCH — 条件付きロジック
SWITCH はネストされた IF ステートメントを置き換え、はるかに読みやすくなりました。
構文: SWITCH(expression, value1, result1, value2, result2, ..., else_result)
例: 顧客セグメントの分類
Customer Segment =
SWITCH(
TRUE(),
[Total Revenue] > 100000, "Enterprise",
[Total Revenue] > 25000, "Mid-Market",
[Total Revenue] > 5000, "SMB",
"Startup"
)
例: 動的なメジャー選択
Selected Measure =
SWITCH(
SELECTEDVALUE(MeasureSelector[Measure]),
"Revenue", [Total Revenue],
"Orders", [Order Count],
"AOV", [Average Order Value],
"Margin", [Gross Margin %],
[Total Revenue]
)
このパターンは、ユーザーがグラフに表示するメトリックを選択できるスライサーと連携して機能します。
10. VAR / RETURN — 変数
変数には中間結果が保存されるため、数式が読みやすくなり、冗長な計算が回避されます。変数は一度評価され、再利用されます。
構文: VAR name = expression RETURN final_expression
例: 変数を含む複雑な KPI
Customer Health Score =
VAR Revenue = [Total Revenue]
VAR OrderCount = [Order Count]
VAR DaysSinceLastOrder =
DATEDIFF(MAX(Sales[OrderDate]), TODAY(), DAY)
VAR RevenueScore =
SWITCH(TRUE(), Revenue > 50000, 3, Revenue > 10000, 2, 1)
VAR FrequencyScore =
SWITCH(TRUE(), OrderCount > 20, 3, OrderCount > 5, 2, 1)
VAR RecencyScore =
SWITCH(TRUE(), DaysSinceLastOrder < 30, 3, DaysSinceLastOrder < 90, 2, 1)
RETURN
RevenueScore + FrequencyScore + RecencyScore
変数がないと、この数式は同じ計算を複数回繰り返すことになり、読みにくくなり、処理速度が遅くなります。
11. 分割 — 安全な分割
DIVIDE はゼロによる除算を適切に処理し、エラーの代わりに指定された代替結果を返します。
構文: DIVIDE(numerator, denominator, [alternate_result])
例:
Conversion Rate =
DIVIDE([Closed Won Deals], [Total Opportunities], 0)
小節では / 演算子の代わりに常に DIVIDE を使用してください。 / 演算子は、ゼロで除算するとエラーを返し、ビジュアルが壊れます。
12. DISTINCTCOUNT — 一意の値を数える
DISTINCTCOUNT は、列内の固有の値の数をカウントします。
構文: DISTINCTCOUNT(column)
例: 期間内のアクティブな顧客
Active Customers =
DISTINCTCOUNT(Sales[CustomerID])
これは、現在のフィルター コンテキスト (選択した月、四半期など) で少なくとも 1 回購入した一意の顧客をカウントします。
13. COUNTROWS — テーブル内の行を数える
COUNTROWS は、テーブル内の行数をカウントします (オプションでフィルター処理されます)。
構文: COUNTROWS(table)
例: 注文数
Order Count =
COUNTROWS(Sales)
Cancelled Orders =
CALCULATE(
COUNTROWS(Sales),
Sales[Status] = "Cancelled"
)
14. SUMX — 行ごとの合計
SUMX は、各行の式を評価し、結果を合計する反復子です。合計する前に列を乗算する必要がある場合に不可欠です。
構文: SUMX(table, expression)
例: 加重平均の計算
Weighted Average Price =
DIVIDE(
SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]),
SUM(Sales[Quantity])
)
SUM では 2 つの列を乗算できません。各行の数量と単価の積を評価し、結果を合計するには SUMX が必要です。
15. AVEAGEX — 行ごとの平均
AVERAGEX は、AVERAGE の反復バージョンです。
構文: AVERAGEX(table, expression)
例: 平均閉店日数
Average Days to Close =
AVERAGEX(
Opportunities,
DATEDIFF(Opportunities[CreatedDate], Opportunities[ClosedDate], DAY)
)
16. MAXX と MINX — イテレータの最小値/最大値
MAXX および MINX は、行ごとに評価される式の最大値または最小値を見つけます。
例: 顧客ごとの最新注文日
Most Recent Order =
MAXX(Sales, Sales[OrderDate])
Oldest Unpaid Invoice =
MINX(
FILTER(Invoices, Invoices[PaymentStatus] = "Unpaid"),
Invoices[InvoiceDate]
)
17. LOOKUPVALUE — VLOOKUP に相当
LOOKUPVALUE は、1 つ以上の検索基準に基づいてテーブルから値を取得します。これは、Excel の VLOOKUP に相当する DAX です。
構文: LOOKUPVALUE(result_column, search_column, search_value, ...)
例:
Customer Region =
LOOKUPVALUE(
Customers[Region],
Customers[CustomerID], Sales[CustomerID]
)
注意: LOOKUPVALUE は通常、メジャーではなく計算列で使用されます。メジャーでは、RELATED (多対 1 の場合) または RELATEDTABLE (1 対多の場合) が優先されます。
18. SELECTEDVALUE — 現在のスライサー値を取得する
SELECTEDVALUE は、フィルター コンテキストに値が 1 つだけ存在する場合に、列の値を返します。複数の値が選択されている場合は、代替の結果が返されます。
構文: SELECTEDVALUE(column, [alternate_result])
例: 動的タイトル
Chart Title =
"Revenue for " & SELECTEDVALUE(DateTable[Year], "All Years")
19. ISBLANK — 空の値をチェックする
ISBLANK は、値が空白 (null/空) かどうかをテストします。
例: 営業担当者が割り当てられていない注文
Unassigned Orders =
CALCULATE(
COUNTROWS(Sales),
ISBLANK(Sales[SalespersonID])
)
20. CONCATENATEX — テーブルの値を連結する
CONCATENATEX はテーブルを反復処理し、値を 1 つの文字列に連結します。
構文: CONCATENATEX(table, expression, [delimiter], [order_by], [order])
例: 顧客が購入した製品のリスト
Products Purchased =
CONCATENATEX(
VALUES(Products[ProductName]),
Products[ProductName],
", ",
Products[ProductName], ASC
)
顧客詳細テーブルでは、顧客ごとに「製品A、製品B、製品C」が表示されます。
タイム インテリジェンスの詳細
ビジネス ユーザーが DAX を必要とする最も一般的な理由は、タイム インテリジェンスです。 Power BI のタイム インテリジェンス関数には、専用の日付テーブルが必要です。ここでは、包括的な時間測定のセットを示します。
前提条件: 日付テーブル
モデルには次の日付テーブルが必要です。
- データ範囲全体をカバーする連続した日付列 (ギャップなし)
- 日付テーブルとしてマークされたテーブル (「表ツール」、「日付テーブルとしてマーク」)
- 日付テーブルの日付列から各ファクト テーブルの日付列への関係
一般的なタイム インテリジェンス測定
-- Month-to-Date
Revenue MTD =
TOTALMTD(SUM(Sales[Revenue]), DateTable[Date])
-- Quarter-to-Date
Revenue QTD =
TOTALQTD(SUM(Sales[Revenue]), DateTable[Date])
-- Year-to-Date
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])
-- Previous Month
Revenue PM =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSMONTH(DateTable[Date]))
-- Previous Quarter
Revenue PQ =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSQUARTER(DateTable[Date]))
-- Previous Year
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSYEAR(DateTable[Date]))
-- Month-over-Month Growth
Revenue MoM % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PM]
RETURN DIVIDE(Current - Prior, Prior, 0)
-- Year-over-Year Growth
Revenue YoY % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PY]
RETURN DIVIDE(Current - Prior, Prior, 0)
-- Rolling 3-Month Average
Revenue 3M Avg =
AVERAGEX(
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -3, MONTH),
CALCULATE(SUM(Sales[Revenue]))
)
-- Cumulative Total (Running Sum)
Revenue Cumulative =
CALCULATE(
SUM(Sales[Revenue]),
FILTER(
ALL(DateTable[Date]),
DateTable[Date] <= MAX(DateTable[Date])
)
)
会計年度のタイム インテリジェンス
会計年度が暦年と一致しない場合は、オプションの year_end_date パラメータを使用します。
-- Fiscal Year ending March 31
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "3/31")
-- Or use DATESYTD for more control
Revenue Fiscal YTD v2 =
CALCULATE(
SUM(Sales[Revenue]),
DATESYTD(DateTable[Date], "3/31")
)
コンテキスト遷移: 隠されたエンジン
コンテキスト遷移は、メジャーが呼び出されたときに (計算列またはイテレータからの) 行コンテキストがフィルター コンテキストに変換されるプロセスです。これは、DAX で最も強力であり、最も誤解されている概念です。
仕組み
次の対策を考えてみましょう。
Total Revenue = SUM(Sales[Revenue])
そして、Products テーブルのこの計算列は次のとおりです。
Product Revenue = [Total Revenue]
計算列には、行コンテキスト (現在の製品行) があります。 [Total Revenue] が呼び出されると、コンテキスト遷移によって行コンテキストがフィルター CALCULATE(SUM(Sales[Revenue]), Products[ProductID] = <current row's ProductID>) に変換されます。その結果、その特定の製品の収益が得られます。
パフォーマンスへの影響
コンテキスト遷移により、メジャー呼び出しの周囲に暗黙的な CALCULATE が追加されます。小さなテーブルの場合、これは無視できます。複雑なメジャーを含む大きなテーブルの場合、コストがかかる可能性があります。大きなテーブルのイテレータ内で複雑なメジャーを呼び出すことは避けてください。
非効率:
-- Iterates over every customer, calling a complex measure each time
Customer Profitability =
SUMX(
Customers,
[Revenue] - [COGS] - [Allocated Overhead]
)
より良いもの:
-- Pre-compute the components and use simple arithmetic
Customer Profitability =
SUM(Sales[Revenue]) - SUM(Sales[COGS]) -
DIVIDE(SUM(Sales[Revenue]), [Total Revenue]) * [Total Overhead]
実践的なビジネス シナリオ
シナリオ 1: ABC 分析 (パレート分類)
製品を A (収益の上位 80%)、B (次の 15%)、C (下位 5%) に分類します。
ABC Class =
VAR CurrentProduct = SELECTEDVALUE(Products[ProductName])
VAR AllProducts =
ADDCOLUMNS(
ALL(Products[ProductName]),
"@Revenue", [Total Revenue]
)
VAR Sorted = TOPN(COUNTROWS(AllProducts), AllProducts, [@Revenue], DESC)
VAR TotalRev = SUMX(AllProducts, [@Revenue])
VAR CumulativeRev =
SUMX(FILTER(Sorted, [@Revenue] >= [Total Revenue]), [@Revenue])
VAR CumulativePct = DIVIDE(CumulativeRev, TotalRev)
RETURN
SWITCH(TRUE(),
CumulativePct <= 0.8, "A",
CumulativePct <= 0.95, "B",
"C"
)
シナリオ 2: コホート維持分析
各獲得コホートの何人の顧客が長期的にアクティブな状態を維持しているかを追跡します。
Cohort Retention Rate =
VAR CohortMonth = SELECTEDVALUE(DateTable[YearMonth])
VAR CohortCustomers =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerID]),
FILTER(
ALL(Sales),
FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
)
)
VAR ActiveCustomers =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerID]),
FILTER(
ALL(Sales),
FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
)
)
RETURN
DIVIDE(ActiveCustomers, CohortCustomers, 0)
シナリオ 3: 年間合計 (MAT) の移動
移動年間合計は、過去 12 か月を合計することで季節性を平滑化します。
Revenue MAT =
CALCULATE(
SUM(Sales[Revenue]),
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)
Revenue MAT Growth =
VAR Current = [Revenue MAT]
VAR Prior =
CALCULATE(
[Revenue MAT],
DATEADD(DateTable[Date], -12, MONTH)
)
RETURN
DIVIDE(Current - Prior, Prior, 0)
イテレータとアグリゲータ: それぞれをいつ使用するか
アグリゲータ関数
SUM、AVERAGE、COUNT、MIN、MAX は単一の列で演算されます。ストレージ エンジンが圧縮された列データから直接解決できるため、高速です。
次の場合に使用します。 1 つの列の単純な集計が必要な場合。
イテレータ関数
SUMX、AVERAGEX、COUNTX、MINX、MAXX、RANKX は式を行ごとに評価します。柔軟性は高くなりますが、数式エンジンが各行を処理するため速度は遅くなります。
次の場合に使用します:
- 集計する前に列を乗算する必要があります (加重計算の場合は SUMX)
- 行ごとに条件を適用する必要があります (COUNTX と IF)
- アイテムをランク付けする必要があります (RANKX)
- 計算は、行レベルの評価が必要な関連テーブルの値に依存します。
パフォーマンスの経験則: アグリゲーターで同じ結果が達成できる場合は、アグリゲーターを使用してください。イテレータは、行ごとの評価が必要な場合にのみ使用してください。
DAX のデバッグ
一般的なエラー メッセージ
| エラー | 原因 | 修正 |
|---|---|---|
| "列 X には単一の値が必要です" | Measure は 1 つが期待される複数の値を返します。 SELECTEDVALUE、MAX、または CALCULATE を使用して 1 つの値に減らします。 | |
| 「循環依存関係」 | 2 つの計算列またはメジャーが相互に参照する | 計算チェーンを再設計してサイクルを削除 |
| 「関係性を判断できません」 | テーブル間のあいまいな関係パス | USERELATIONSHIP で関係を指定するか、アクティブ化します。 |
| "式は複数の列を参照しています" | ALL/VALUES が複数の列で誤って使用されています。 ALL(Table) または ALL(Table[Col1], Table[Col2]) を使用します。 |
パフォーマンスアナライザー
Power BI Desktop のパフォーマンス アナライザー ([表示]、[パフォーマンス アナライザー]) には、各ビジュアルの DAX クエリと実行時間が表示されます。これを使用して次のことを行います。
- 遅いビジュアルを特定します (1 秒以上) 2.詳細な分析のために DAX クエリを DAX Studio にコピーします
- 施策最適化時の実行前後の時間を比較する
DAX スタジオ
DAX Studio は、詳細なクエリ分析を提供する無料の外部ツールです。それは以下を示します:
- ストレージ エンジン クエリ (高速な列ストア スキャン)
- 数式エンジンのクエリ (低速な行ごとの評価)
- マテリアライゼーションのサイズ (エンジン間でデータがシャッフルされる)
メジャーが多くの数式エンジン クエリを生成する場合、使用する反復子または複雑な FILTER 式が多すぎる可能性があります。リファクタリングして、より多くの作業をストレージ エンジンにプッシュします。
基礎から高度な最適化まで DAX をカバーする Power BI トレーニング については、ECOSIRE が特定のデータセットやビジネス上の質問に合わせた実践的なワークショップを提供しています。
よくある質問
メジャーと計算列の違いは何ですか?
メジャーは、クエリ時に現在のフィルター コンテキスト内で評価されます。テーブルにデータを追加するのではなく、値を動的に計算します。計算列はデータ更新時に評価され、テーブルに物理列を追加します。スライサーとフィルターに基づいて変化する集計と KPI のメジャーを使用します。計算列は、スライサー、フィルター、またはリレーションシップで使用する必要がある行レベルの分類または値に使用します。モデルのサイズを増加させないため、ほとんどの場合、メジャーが推奨されます。
YTD メジャーに誤った値が表示されるのはなぜですか?
最も一般的な原因は、日付テーブルが適切に構成されていないことです。 3 つのことを確認します: (1) 日付テーブルにギャップがない --- データの開始から現在までのすべての日付が含まれている必要がある、(2) テーブルが Power BI で日付テーブルとしてマークされていること ([テーブル ツール]、[日付テーブルとしてマーク])、(3) 日付テーブルとファクト テーブルの間のリレーションシップがアクティブであり、正しくマップされていること。また、日付列に、正確な一致を妨げる時刻コンポーネントが含まれていないことを確認してください。
CALCULATE と FILTER はどのような場合に使用すべきですか?
フィルターを単純な列比較として表現できる場合 (Products[Category] = "Electronics" など)、CALCULATE を使用します。 CALCULATE は、これをストレージ エンジンが最適化できる効率的なフィルターに変換します。複数の列を参照する、またはメジャーを呼び出す複雑な行ごとの条件が必要な場合は、FILTER を使用します (例: CALCULATE(COUNTROWS(Sales)) > 5 の顧客をフィルタリングする)。 FILTER は反復子であり、処理速度が遅いため、可能な場合は CALCULATE の単純な構文を使用することをお勧めします。
DAX で累計または累積合計を作成するにはどうすればよいですか?
現在の日付までのすべての日付を含むフィルターを指定して CALCULATE を使用します: Revenue Cumulative = CALCULATE(SUM(Sales[Revenue]), FILTER(ALL(DateTable[Date]), DateTable[Date] <= MAX(DateTable[Date])))。これにより、既存の日付フィルター (ALL) が削除され、現在のコンテキストの最初の日付から最大の日付までのすべての日付を含むフィルターに置き換えられます。月次マトリックスの各行には、その月の累計が表示されます。
DAX を使用してデータをデータベースに書き戻すことはできますか?
いいえ。DAX は読み取り専用のクエリ言語です。表示用にデータを計算、フィルタリング、変換できますが、ソース データベース内のデータを挿入、更新、削除することはできません。ライトバック シナリオの場合は、Power BI に埋め込まれた Power Apps を使用するか、Power BI アラートによってトリガーされる Power Automate フローを使用します。一部のサードパーティ ツール (Acterys、Writeback Manager) は、カスタム ビジュアルを通じてライトバック機能を追加します。
執筆者
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
関連記事
会計 KPI: すべての企業が追跡すべき 30 の財務指標
収益性、流動性、効率性、粗利益、EBITDA、DSO、DPO、在庫回転数などの成長指標を含む 30 の重要な会計 KPI を追跡します。
ビジネス インテリジェンスのためのデータ ウェアハウス: アーキテクチャと実装
ビジネス インテリジェンスのための最新のデータ ウェアハウスを構築します。 Snowflake、BigQuery、Redshift を比較し、ETL/ELT、ディメンション モデリング、Power BI 統合について学びます。
Power BI 顧客分析: RFM セグメンテーションとライフタイム バリュー
DAX 数式を使用して、RFM セグメンテーション、コホート分析、チャーン予測の視覚化、CLV 計算、カスタマー ジャーニー マッピングを Power BI に実装します。
Data Analytics & BIのその他の記事
会計 KPI: すべての企業が追跡すべき 30 の財務指標
収益性、流動性、効率性、粗利益、EBITDA、DSO、DPO、在庫回転数などの成長指標を含む 30 の重要な会計 KPI を追跡します。
ビジネス インテリジェンスのためのデータ ウェアハウス: アーキテクチャと実装
ビジネス インテリジェンスのための最新のデータ ウェアハウスを構築します。 Snowflake、BigQuery、Redshift を比較し、ETL/ELT、ディメンション モデリング、Power BI 統合について学びます。
Power BI 顧客分析: RFM セグメンテーションとライフタイム バリュー
DAX 数式を使用して、RFM セグメンテーション、コホート分析、チャーン予測の視覚化、CLV 計算、カスタマー ジャーニー マッピングを Power BI に実装します。
Power BI と Excel: ビジネス分析をアップグレードする時期
データ制限、視覚化、リアルタイム更新、コラボレーション、ガバナンス、コスト、移行をカバーするビジネス分析に関する Power BI と Excel の比較。
ビジネスのための予測分析: 実践的な実装ガイド
販売、マーケティング、運営、財務全体にわたって予測分析を実装します。モデルの選択、データ要件、Power BI 統合、およびデータ文化ガイド。
Power BI を使用した財務ダッシュボードの構築
Power BI で財務ダッシュボードを構築するためのステップバイステップ ガイド。会計システムへのデータ接続、KPI の DAX 測定、損益の視覚化、ベスト プラクティスをカバーします。