[Power BI] DAXクエリことはじめ🎉 

# はじめに

Power BIでレポートを作成するために、**DAX**を学ぶ方は多いと思います。
DAXを勉強しようと思って、ググって、公式ドキュメントを読んだり、QiitaやSQLBIの記事を読むと、なにやら見慣れぬ構文で書かれている**DAXっぽい**もの…これをみて頭が真っ白になった方も多いのでは。私もそうでした😭

#### DAXクエリ？🤔

```
EVALUATE
SUMMARIZE (
    Sales,
    'Product'[Brand],
    'Product'[Color],
    "Amount", [Sales Amount]
)
ORDER BY
[Amount] DESC
```

DAXクエリとDAXは似ています。
関数などはほとんど一緒です。
しかし、イコールではありません。

DAXクエリのことを少しでも知っていると、勉強が捗ります。もちろん、開発も捗ります。
DAXの基礎がわかっていれば怖くありません！今日、DAXクエリに入門しましょう～🎉

# DAX.do

まずは便利サイトのご紹介。

https://dax.do/

あらかじめ、データモデルが用意してあり、そのデータモデルに対してDAXクエリを記述・実行し、結果を見ることができるサイトです。DAXの練習には持って来い！DAXのインテリセンスも表示されるし、関数をクリックすると右側にDAXガイドと連携して文法も表示してくれます。**本記事で書いているDAXクエリはDAX.doで記述可能なもの**なので、ぜひコピペ→実行し、カスタマイズなどしてみてどうなるか試してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e96afc74-2421-4fae-044c-523d6ad87f18.png)

# DAXクエリの使い所

SQLBIのホワイトペーパーには以下のように書かれています。

https://www.sqlbi.com/whitepapers/writing-dax-queries/

>DAX 言語は、Power BI、Analysis Services、または Power Pivot for Excel のいずれかの表形式モデルでメジャーと計算列を作成するためによく使用されます。ただし、DAXは、モデルのクエリとレポートの表示のためにPower BIで使用される言語でもあります。ユーザーとモデル作成者は、複数の目的でDAXクエリを使用することもできます。

- ページ分割されたレポート: Power BI サービスで発行された既存の**データセットからデータを取得**します。
- Power BI または分析サービスからデータをエクスポートする: DAX Studioを使用して DAXクエリを実行し、**結果をCSVまたは Excel ファイルに保存**します。
- Power BI または Analysis Services を新しい Power BI モデルのデータ ソースとして使用する: 複合モデルがオプションではない場合は、XMLA エンドポイントを介して接続して、**既存の表形式モデルからデータを抽出**します。
- Excel テーブルにデータをインポートする: Analysis ServicesデータベースまたはPower BIデータセットに接続されたExcelテーブルにカスタムDAXクエリを作成します。

また最近だと**Power AutomateのアクションにもDAXクエリを書くことができるようになった**ので、DAXクエリを使いこなせば自由自在に**データセットからデータを取り出して活用**できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/8b196735-5ffa-1e03-7ac0-fbe5d6f64005.png)

# Power BI Desktopで確認

Power BI Desktopで**パフォーマンスアナライザー**を開くとDAXクエリを見ることができます。
ビジュアルの中で数値を計算するために使用されるのがDAXで、ビジュアル全体を出力するために使われているのが**DAXクエリ**です。

画像では、SalesAmount列を作成するために定義しているのがDAXです。見慣れた書き方ですよね。

カラー列、プロダクト列をグループ化し、SalesAmount列を集計し、そしてテーブル形式で出力するために、データセットに対して問い合わせているのがDAXクエリです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/8d2eb8c9-5bd4-8d4a-f879-5b0f0846e173.png)

# DAXクエリの構文

https://learn.microsoft.com/ja-jp/dax/dax-queries

```
[DEFINE 
    (
     (MEASURE <table name>[<measure name>] = <scalar expression>) | 
     (VAR <var name> = <table or scalar expression>) |
     (TABLE <table name> = <table expression>) | 
     (COLUMN <table name>[<column name>] = <scalar expression>) | 
    ) + 
]
EVALUATE <table>
[ORDER BY {<expression> [{ASC | DESC}]}[, …]]  
[START AT {<value>|<parameter>} [, …]]]
```

## 必須 EVALUATE

DAXクエリを構成するために最低限必要なのが`EVALUATE`です。これだけあればDAXクエリは実行できます。
最小単位は`EVALUATE`のあとにテーブル式を記入することです。

```
EVALUATE
Sales
```

Salesテーブルの全件を出力されます。
以下リンククリックをクリックするとDAX.doでクエリ結果を見られます。

https://dax.do/lVUlKarkSBw832/

## オプション ORDER BY

`EVALUATE` の後ろで宣言します。

```
[ORDER BY {<expression> [{ASC | DESC}]}[, …]]  
```

プロダクトカラー別の売上をみたいときには、こんな感じで書いてあげます。

```
EVALUATE
ADDCOLUMNS (
    SUMMARIZE ( 'Product', 'Product'[Color] ),
    "SalesAmt", CALCULATE ( SUMX ( 'Sales', Sales[Net Price] * Sales[Quantity] ) )
)
ORDER BY [SalesAmt] DESC
```

すると結果はこんな感じ。

<div class="dax-do-results"><table><thead><tr><th title="Color">Color</th><th title="売上">売上</th></tr></thead><tbody><tr><td class="col-string">Silver</td><td class="col-float">6,798,560.86</td></tr><tr><td class="col-string">Blue</td><td class="col-float">2,435,444.62</td></tr><tr><td class="col-string">White</td><td class="col-float">5,829,599.91</td></tr><tr><td class="col-string">Red</td><td class="col-float">1,110,102.10</td></tr><tr><td class="col-string">Black</td><td class="col-float">5,860,066.14</td></tr><tr><td class="col-string">Green</td><td class="col-float">1,403,184.38</td></tr><tr><td class="col-string">Orange</td><td class="col-float">857,320.28</td></tr><tr><td class="col-string">Pink</td><td class="col-float">828,638.54</td></tr><tr><td class="col-string">Yellow</td><td class="col-float">89,715.56</td></tr><tr><td class="col-string">Purple</td><td class="col-float">5,973.84</td></tr><tr><td class="col-string">Brown</td><td class="col-float">1,029,508.95</td></tr><tr><td class="col-string">Grey</td><td class="col-float">3,509,138.09</td></tr><tr><td class="col-string">Gold</td><td class="col-float">361,496.01</td></tr><tr><td class="col-string">Azure</td><td class="col-float">97,389.89</td></tr><tr><td class="col-string">Silver Grey</td><td class="col-float">371,908.92</td></tr><tr><td class="col-string">Transparent</td><td class="col-float">3,295.89</td></tr></tbody></table></div>

`ORDER BY`をつけることによって、任意の列の降順・昇順を決めることができることがわかります。

## オプション `START AT`

`EVALUATE` → `ORDER BY` → `START AT` の順番で並べます。クエリ結果を開始する値を定義します。
`START AT`は`ORDER BY`と1対1で対応しています。

構文は下記。

```
[START AT {<value>|<parameter>} [, …]]]
```

実際に先程のDAXクエリに`START AT`を付け足してみます。

```
EVALUATE
ADDCOLUMNS (
    SUMMARIZE ( 'Product', 'Product'[Color] ),
    "SalesAmt", CALCULATE ( SUMX ( 'Sales', Sales[Net Price] * Sales[Quantity] ) )
)
ORDER BY [SalesAmt] DESC
START AT 5860066.14
```

結果はこうなり、Black以下しか出力されていないことが確認できます。

<div class="dax-do-results"><table><thead><tr><th title="Color">Color</th><th title="SalesAmt">SalesAmt</th></tr></thead><tbody><tr><td class="col-string">Black</td><td class="col-float">5,860,066.14</td></tr><tr><td class="col-string">White</td><td class="col-float">5,829,599.91</td></tr><tr><td class="col-string">Grey</td><td class="col-float">3,509,138.09</td></tr><tr><td class="col-string">Blue</td><td class="col-float">2,435,444.62</td></tr><tr><td class="col-string">Green</td><td class="col-float">1,403,184.38</td></tr><tr><td class="col-string">Red</td><td class="col-float">1,110,102.10</td></tr><tr><td class="col-string">Brown</td><td class="col-float">1,029,508.95</td></tr><tr><td class="col-string">Orange</td><td class="col-float">857,320.28</td></tr><tr><td class="col-string">Pink</td><td class="col-float">828,638.54</td></tr><tr><td class="col-string">Silver Grey</td><td class="col-float">371,908.92</td></tr><tr><td class="col-string">Gold</td><td class="col-float">361,496.01</td></tr><tr><td class="col-string">Azure</td><td class="col-float">97,389.89</td></tr><tr><td class="col-string">Yellow</td><td class="col-float">89,715.56</td></tr><tr><td class="col-string">Purple</td><td class="col-float">5,973.84</td></tr><tr><td class="col-string">Transparent</td><td class="col-float">3,295.89</td></tr></tbody></table></div>

## オプション DEFINE

`DEFINE`は`EVALUATE`の前に書きます。

またその中で`DEFINE`（定義）できるものが4つあります。

- MEASURE
- VAR
- TABLE
- COLUMN

それぞれ、Power BI Desktopでレポートを開発する際に作成をしている、

- メジャー
- 変数
- 計算テーブル
- 計算列

になります。

```
[DEFINE 
    (
     (MEASURE <table name>[<measure name>] = <scalar expression>) | 
     (VAR <var name> = <table or scalar expression>) |
     (TABLE <table name> = <table expression>) | 
     (COLUMN <table name>[<column name>] = <scalar expression>) | 
    ) + 
]
```

例えばさきほどから実行しているDAXクエリの、`EVALUATE`以下を変数に置き換えてみます。Power BI Desktopで記述するメジャーと同様に`VAR`（変数）を使用して可読性の高いコードを書くことができます。

```
DEFINE
    VAR Producttbl =
        ADDCOLUMNS (
            SUMMARIZE ( 'Product', 'Product'[Color] ),
            "SalesAmt", CALCULATE ( SUMX ( 'Sales', Sales[Net Price] * Sales[Quantity] ) )
        )

EVALUATE
Producttbl

ORDER BY [SalesAmt] DESC
START AT 5860066.14
```

またこのように記述すると、Salesテーブルに新しい計算列が追加されていることが確認できます。

```
DEFINE
    COLUMN Sales[SalesAmount] = Sales[Net Price] * Sales[Quantity]

EVALUATE
Sales
```

# さいごに

DAXクエリを理解するためにはまずDAXを勉強すること。Docsにも書いてありますよね。DAXを一周したあとにDAXクエリの構文を理解してテーブルを生成するためによく使われる`SUMMARIZE`、`ADDCOLUMNS`、`SUMMARIZECOLUMNS`などの関数をおさらい。そうすると理解が深まっていくと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/eeedf390-bb20-25aa-78a9-0a619523148b.png)

https://learn.microsoft.com/ja-jp/dax/dax-queries