Power BI Desktop における DAX の基本を学習する

Power BI Desktop を初めて使用するユーザーは、この記事を、Data Analysis Expressions (DAX) を使用して多くの基本的な計算とデータ分析の問題を解決する方法についての簡単かつ迅速な導入ガイドとして使用できます。 いくつかの概念について説明した後、一連のタスクを実行します。学んだ内容をテストする知識チェックも含まれています。 この記事を完了すると、DAX で最も重要な基本概念をよく理解できるようになります。

DAX とは

DAX は、関数、演算子、および定数を集めたもので、これらを数式または式の中で使用して、1 つまたは複数の値を計算して返すことができます。 DAX は、現在のモデルに既に含まれているデータから新しい情報を作成するのに役立ちます。

DAX が重要である理由

簡単に新しい Power BI Desktop ファイルを作成し、そこにデータをインポートすることができます。 DAX 数式をまったく使用せずに、価値ある洞察を表示するレポートを作成することもできます。 しかし、複数の製品カテゴリと、さまざまな日付範囲での成長率を分析する必要がある場合はどうでしょうか。 または、前年比の成長率を市場の傾向と比較して計算する必要がある場合はどうでしょうか。 DAX 数式は、そのような機能を備えており、その他にも多くの重要な機能があります。 効率の良い DAX 数式を作成する方法を習得すれば、データを最大限に活用するのに役立ちます。 必要な情報を取得する際に、最終結果に影響する実際のビジネス問題の解決を始めることができます。

前提条件

Microsoft Excel で数式を作成することに既に慣れている場合、その知識は DAX を理解する上で役に立ちます。 しかし、Excel の数式の使用経験がない場合でも、ここで説明する概念は、DAX 式を作成し、実世界での BI の問題を解決するのに役立ちます。

ここでは、計算で使用される DAX 式を理解することに焦点を合わせ、メジャーと計算列について具体的に説明します。 読者は Power BI Desktop でのデータのインポートやレポートへのフィールドの追加などの操作を既に理解しており、メジャーおよび計算列についても基礎的な概念を理解しているものと想定します。

ブックの例

DAX について学習する最善の方法は、基本的な数式を作成し、それを実際のデータに対して使用して、その結果を自分で見ることです。 この記事の例とタスクでは、Contoso Sales Sample for Power BI Desktop ファイルを使用します。 このサンプル ファイルは、「チュートリアル: Power BI Desktop での独自のメジャーの作成」の記事で使用しているのと同じものです。

それでは始めましょう。

DAX について説明するにあたり、この記事では、"構文"、"関数"、"コンテキスト" という 3 つの基本的な概念を土台にします。 DAX にはこれ以外にも重要な概念がありますが、これら 3 つの概念を理解することは、DAX のスキルを構築するための最適な土台を提供します。

構文

独自の数式を作成する前に、DAX の数式の構文を見てみましょう。 構文には、数式を構成するさまざまな要素が含まれています。さらに単純に言うと、数式をどのように書くか、ということが構文です。 たとえば、メジャーに対する簡単な DAX 式を次に示します。

個々の構文要素へのポインターを含む DAX 式のスクリーンショット。

この式には、次の構文要素が含まれています。

A. メジャー名。Total Sales です。

B. 等号演算子 ( = )。式の先頭を示します。 計算が完了すると、結果が返されます。

C. DAX 関数 SUMSales[SalesAmount] 列にあるすべての値を合計します。 関数については、後で詳しく説明します。

D. かっこ ()。1 つ以上の引数を含む式を囲みます。 ほとんどの関数には、少なくとも 1 つの引数が必要です。 引数は、関数に値を渡します。

E. 参照先のテーブル。Sales です。

F. Sales テーブル内の参照先の列。[SalesAmount] です。 この引数により、合計を集計する列を SUM 関数に伝えます。

DAX 式を解釈するときは、式の各要素を分割し、日常会話の言葉に置き換えてみることが役立ちます。 たとえば、この式は、次のように読むことができます。

"Total Sales" という名前のメジャーについて、Sales テーブル内の [SalesAmount] 列の値の合計を計算する (=)。

このメジャーをレポートに追加すると、組み込んだ他のフィールド (たとえば、"Cell Phones in the USA") のそれぞれについて売上高の合計値を計算して返します。

ここで、"このメジャーは、前に別の記事でレポートに SalesAmount フィールドを追加しただけで実行できたのと同じものではないか" という疑問が浮かぶかもしれません。そのとおりです。 しかし、"SalesAmount" フィールドからの値を合計する独自のメジャーを作成することには十分な理由があります。他の数式で引数として使用できるからです。 この解決方法は少しわかりづらいかもしれませんが、DAX 式のスキルが上がると、このメジャーを使用することで式やモデルの効率が上がることを理解できるはずです。 実際、この後で登場する Total Sales メジャーは、他の数式の引数として使用されています。

次に、この数式に関して、詳細な点をいくつか説明します。 まず、SUM という関数に注目します。 関数は、数値、日付、時刻、テキストなどを使用した複雑な計算や操作を容易に実行できるようにする、事前に記述された数式です。 関数については、後で詳しく説明します。

別の点として、列名 [SalesAmount] の前に、その列が属する Sales テーブルが指定されていることに注目します。 この名前は、完全修飾列名というもので、テーブル名を列名の前に指定します。 同じテーブルで参照されている列では、式にテーブル名を含める必要はありません。これにより、多数の列が参照されている長い式をできるだけ短く、また読みやすく書くことができます。 ただし、同じテーブルにある場合でも、メジャーの式にはテーブル名を含めることをお勧めします。

注意

テーブル名にスペース、予約されたキーワード、または使用できない文字が含まれる場合は、テーブル名を単一引用符で囲む必要があります。 現在のロケールがその文字セットをサポートしているかどうかに関係なく、ANSI 英数字の範囲外のいずれかの文字が名前に含まれる場合にも、テーブル名を引用符で囲む必要があります。

数式は、正しい構文で記述することが重要です。 ほとんどの場合、構文が正しくないと、構文エラーが返されます。 他のケースとして、構文は正しくても、返される値が予期したものと違う場合があります。 Power BI Desktop の DAX エディターには、適切な要素を選択できるように支援し、正しい構文で数式を作成できるようにする提案機能があります。

例の式を作成してみましょう。 このタスクを実行すると、数式の構文について理解を深め、数式バーに表示される提案機能がどのように役立つかを知ることができます。

タスク: メジャーの式を作成する

  1. Contoso Sales Sample Power BI Desktop ファイルをダウンロードして開きます。

  2. [レポート] ビューのフィールド リストで Sales テーブルを右クリックし、[新しいメジャー] を選択します。

  3. 数式バーで、新しいメジャー名として「Previous Quarter Sales」と入力して、"Measure" をそれに置き換えます。

  4. 等号の後に、最初の数文字の CAL を入力し、使用する関数をダブルクリックします。 この数式では、CALCULATE 関数を使用します。

    CALCULATE 関数は、CALCULATE 関数に渡す引数に基づいて、合計する金額をフィルター処理するために使用します。 この種の関数は、入れ子になった関数と呼ばれます。 CALCULATE 関数には、少なくとも 2 つの引数が必要です。 1 つ目の引数は評価する式、2 つ目の引数はフィルターです。

  5. CALCULATE 関数の始めかっこ ( の後に、SUM ともう 1 つ始めかっこ ( を入力します。

    次に、SUM 関数に引数を渡します。

  6. Sal と入力を開始し、Sales[SalesAmount] を選択して、閉じかっこ ) と続けます。

    この手順では、CALCULATE 関数に対する最初の引数となる式を作成します。

  7. 最初のフィルターを指定するために、コンマ (,) を入力した後、PREVIOUSQUARTER と入力します。

    PREVIOUSQUARTER というタイム インテリジェンス関数を使用すると、前の四半期にフィルター処理して SUM の結果を計算できます。

  8. PREVIOUSQUARTER 関数の始めかっこ ( の後に、Calendar[DateKey] と入力します。

    PREVIOUSQUARTER 関数には、1 つの引数として、連続した日付範囲を含む列を指定します。 この場合、これは Calendar テーブルの DateKey 列になります。

  9. PREVIOUSQUARTER 関数および CALCULATE 関数に渡した両方の引数を、2 つの終了かっこ )) を入力して閉じます。

    数式は、次のようになるはずです。

    Previous Quarter Sales = CALCULATE(SUM(Sales[SalesAmount]), PREVIOUSQUARTER(Calendar[DateKey]))

  10. 数式バーのチェックマーク チェックマーク アイコン を選ぶか、Enter キーを押して、数式を検証し、それを Sales テーブルに追加します。

おめでとうございます。 DAX を使って複雑なメジャーを作成しました。 この式で実行する内容は、レポートに適用するフィルターに応じて、前の四半期の売上合計を計算することです。 たとえば、Sales テーブルの SalesAmount と新しい Previous Quarter Sales メジャーを集合縦棒グラフに配置できます。 次に、Calendar テーブルからスライサーとして Year を追加し、2011 を選びます。 次に、別のスライサーとして QuarterOfYear を追加し、4 を選ぶと、このようなグラフが得られます。

Previous Quarter Sales と SalesAmount のグラフ

サンプル モデルには、2011 年 1 月 1 日から 2013 年 1 月 19 日までの少量の売上データのみが含まれていることに注意してください。 SalesAmount を合計できない年または四半期を選んだ場合や、新しいメジャーで現在または前の四半期の売上データを計算できない場合、その期間のデータは表示されません。 たとえば、Year に "2011"、QuarterOfYear に "1" を選んだ場合、2010 年の第 4 四半期のデータがないため、Previous Quarter Sales のデータは表示されません。

DAX 式のいくつかの重要な側面を紹介しました。

  • この式には 2 つの関数が含まれています。 PREVIOUSQUARTER タイム インテリジェンス関数が、CALCULATE フィルター関数に渡される引数として入れ子になっています。

    DAX 数式には、最大 64 個の入れ子になった関数を含めることができます。 もっとも、そこまで多くの入れ子にした関数を含む数式はほとんど使われないはずです。 実際、そのような式を作成し、デバッグするのは困難ですし、おそらく計算時間も長くなります。

  • この数式では、フィルターも使用しました。 フィルターは、計算する対象を絞り込みます。 その場合、引数として 1 つのフィルターを選択します。実際には、フィルターは別の関数の結果です。 フィルターについては、後で詳しく説明します。

  • CALCULATE 関数を使用しました。 この関数は、DAX で最も強力な関数の 1 つです。 モデルを作成してさらに複雑な式を作成するようになると、おそらくこの関数を多数使用することになります。 CALCULATE 関数についてさらに説明するのはこの記事の範囲外ですが、DAX の知識が増すにつれて、この関数に特に注意を向けてください。

構文クイズ

  1. 数式バーのこのボタンはどのように機能しますか。

    ボタンの選択

  2. DAX の数式にある列名は常に何で囲まれていますか。

答えは、この記事の最後に記載します。

関数

関数は、特定の順序または構造で並んだ特定の値 (引数と呼びます) を使用して計算を実行する、定義済みの数式です。 引数として指定できるのは、別の関数、別の数式、式、列参照、数値、テキスト、TRUE または FALSE などの論理値、または定数です。

DAX に含まれる関数のカテゴリは次のとおりです: 日付と時刻タイム インテリジェンス情報論理数学統計テキスト親子、およびその他の関数。 Excel の数式の関数に慣れている読者は、DAX 関数の多くが Excel 関数に似ていると感じるかもしれません。ただし、DAX 関数は、次のような点が特有です。

  • DAX 関数は、常に列全体またはテーブル全体を参照します。 テーブルまたは列の特定の値のみを使用する場合は、数式にフィルターを追加できます。

  • 行ごとに計算をカスタマイズする必要がある場合、DAX は、現在の行の値または関連する値を一種の引数として使用し、コンテキストに応じて異なる計算を実行する機能を提供しています。 コンテキストについては、後で詳しく説明します。

  • DAX には、値ではなくテーブルを返す関数が多く含まれています。 テーブルは表示されませんが、他の関数への入力を提供するために使用されます。 たとえば、テーブルを取得して、含まれる個別値をカウントしたり、フィルター処理されたテーブルまたは列における動的な合計を計算したりすることができます。

  • DAX には、さまざまなタイム インテリジェンス関数が含まれています。 これらの関数では、日付範囲を定義または選択し、それに基づいて動的な計算を実行できます。 たとえば、並列期間の合計を比較できます。

  • Excel には、VLOOKUP というよく使用される関数があります。 DAX 関数では、Excel での VLOOKUP のようには、セルまたはセル範囲を参照することがありません。 DAX 関数では、列またはテーブルを参照として受け取ります。 また、Power BI Desktop ではリレーショナル データ モデルを取り扱うという点に注意してください。 別のテーブル内の値を検索することは簡単な操作で、ほとんどの場合、数式を作成する必要はまったくありません。

    ご覧のとおり、DAX の関数を使用すると強力な数式を作成できます。 ここでは、関数の基礎的な部分だけを紹介しました。 DAX のスキルが増すにつれて、多くの異なる関数を使用して数式を作成できるようになります。 各 DAX 関数の詳細について学ぶ最適な資料の 1 つは、「DAX 関数リファレンス」です。

関数クイズ

  1. 関数が常に参照するものは何ですか?
  2. 1 つの数式に複数の関数を含めることはできますか?
  3. 2 つのテキスト文字列を連結して 1 つの文字列にするために使用する関数のカテゴリは何ですか?

答えは、この記事の最後に記載します。

コンテキスト

コンテキストは、理解しておくべき最も重要な DAX の概念の 1 つです。 DAX には、行コンテキストとフィルター コンテキストという 2 種類のコンテキストがあります。 最初に、行コンテキストについて説明します。

行コンテキスト

最も簡単に考えると、行コンテキストは現在の行であると考えることができます。 行コンテキストは、テーブル内の単一行を識別するためのフィルターを適用する関数が数式に含まれている場合に適用されます。 この関数は、その本来的な機能として、フィルターの対象であるテーブルの各行の行コンテキストに適用されます。 この種類の行コンテキストは、通常、メジャーに適用されます。

フィルター コンテキスト

フィルター コンテキストは、行コンテキストよりも理解するのが難しい考え方です。 最も簡単に考えると、結果または値を決定する計算に適用される 1 つまたは複数のフィルターのことを、フィルター コンテキストと考えることができます。

フィルター コンテキストは、行コンテキストの代わりにはなりません。むしろ、行コンテキストに追加して適用されるものです。 たとえば、計算に含める値をさらに絞り込むために、行コンテキストを指定するだけでなく、その行コンテキスト内の特定の値 (フィルター) を指定するフィルター コンテキストを適用できます。

フィルター コンテキストは、レポート内で簡単に確認できます。 たとえば、視覚化に TotalCost を追加し、さらに Year と Region を追加すると、特定の年度と地域に基づいてデータのサブセットを選ぶフィルター コンテキストを定義したことになります。

DAX でフィルター コンテキストが非常に重要なのはなぜでしょうか。 フィルター コンテキストは、視覚化にフィールドを追加することで適用できることを確認しました。 フィルター コンテキストは、フィルター (ALL、RELATED、FILTER、CALCULATE などの関数を使うもの、リレーションシップによるもの、他のメジャーと列によるもの) を定義して DAX 式に適用することもできます。 たとえば、次の数式に含まれる "Store Sales" という名前のメジャーについて考えてみましょう。

Store Sales メジャー

この式をよりよく理解するために、他の数式と同じように、細かく分割してみます。

この式には、次の構文要素が含まれています。

A. メジャー名。Store Sales です。

B. 等号演算子 ( = )。式の先頭を示します。

C. CALCULATE 関数。指定したフィルターによって変更されたコンテキストで、式を引数として評価します。

D. かっこ ()。1 つ以上の引数を含む式を囲みます。

E. メジャー [Total Sales] は式と同じテーブルに含まれます。 メジャー Total Sales の数式は、=SUM(Sales[SalesAmount]) です。

F. コンマ (,)。式の最初の引数とフィルター引数を分離します。

G. 完全修飾された参照列 Channel[ChannelName] です。 この例では、これが行コンテキストです。 この列の各行には、販売経路 (Store、Online など) が指定されています。

H. フィルターとして指定した特定の値 (Store) です。 この例では、これがフィルター コンテキストです。

この数式では、メジャー "Total Sales" によって定義される売上値が、Channel[ChannelName] 列にフィルター値として使用される Store が入っている行についてのみ計算されます。

ご想像のとおり、数式で定義できるフィルター コンテキストには、強力な機能が非常に多く含まれています。 関連するテーブルで特定の値のみを参照する機能は、その一例に過ぎません。 コンテキストについて今すぐに完全に理解できないとしても、問題ありません。 自分で独自の数式を作成するにつれて、コンテキストについて理解が深まり、コンテキストが DAX において非常に重要である理由をよく理解できるようになります。

コンテキストのクイズ

  1. コンテキストの 2 つの種類には何がありますか?
  2. フィルター コンテキストとは?
  3. 行コンテキストとは?

答えは、この記事の最後に記載します。

まとめ

ここまでで、DAX の最も重要な概念の基礎を理解できましたので、さっそく、独自のメジャーの DAX 数式を作成できます。 DAX には確かに理解しにくい部分がありますが、多くの参考資料を入手できます。 この記事を読みながら、独自の数式を実際に作成してみると、ビジネス上の実際の課題を解決するために役立つその他の DAX の概念や数式についても理解できるようになります。 入手可能な DAX リソースは多数ありますが、最も重要なものは「Data Analysis Expressions (DAX) リファレンス」です。

Power Pivot や Analysis Services 表形式モデルなどの Microsoft BI ツールで DAX が利用されるようになって数年が経ち、多数の良質な情報を入手できるようになりました。 また、Microsoft や指導的な BI プロフェッショナルが執筆した書籍、ホワイトペーパー、およびブログからも、さらに詳細な情報を知ることができます。 DAX リソース センターも、開始するのに最適な場所です。

クイッククイズの答え

構文:

  1. メジャーを検証し、モデルに入力します。
  2. 角かっこ [] です。

関数:

  1. テーブルと列です。
  2. 正解です。 数式には最大 64 個の入れ子になった関数を含めることができます。
  3. テキスト関数

コンテキスト:

  1. 行コンテキストとフィルター コンテキストです。
  2. 単一の値を決定するための計算に含まれる 1 つ以上のフィルターのことです。
  3. 現在の行のことです。