Power BI等のDAXは怖くないよ!

# はじめに
 Power BI Desktop等で使えるDAXについて、私が最初の一歩と感じたところをまとめてみました。

## ご注意
　以下は**「主にここから」**という代表的な使い方や考え方です。Power BIで表現できる方法等は、**同じ結果でも複数**あります。どちらの結果も正しく、実行時間の差（計算効率）がある、あとで何をしたかったわかる等それぞれ特性があります。でてくる結果が誤りでなければ、複数の方法があり、**こうじゃなくちゃいけない**ということはないんです。トライしてDAXに慣れていくことが大事です～。

　また、ここで記載することも、私が基本的なところ**と思っている**ものを取り出しているというものです。各DAXの詳細は、マイクロソフトのドキュメントやLearn等を参照してください。

## Power BIは基本的に最新版を使う
　Power BI Desktop等は基本毎月更新です。最新版かどうかでメニュー等も変わっていきます。以下の図は、基本は2020年7月版に基づいており、今後表記等が変わっていくかもしれませんが、適時読み替えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/9ea5904c-2048-9ac9-eed0-bdffcf75ccd5.png)


## DAXはPower BIで以外でも登場する
　なぜタイトルがPower BI **等** になっているかというと、ExcelのPower Pivot等、DAXに対応する他のものでも使える共通言語だからです。

## DAXって、Power BIのどこで主に使うの?

　Power BIの画面は (1) ビジュアルをモデリング等を行う**メイン画面**（正式名がわからないため、勝手に読んでいるもの）と、(2)読み込んだデータを整える**Power Query エディター**の**大きく2種類の画面**があります。その中で主に使われる言語も、**(1)ではDAX**(計算列やメジャー等で使う言語。Data Analysis Expressionsの略)、**(2)ではPower Query M 数式言語**(formula language)の2種類あります。
　DAXとMを区別して、**DAXはメイン画面**で使うと覚えましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c073044e-8765-26e2-2649-90b391581927.png)


### メイン画面からPower Queryへは
　データソースからテーブルを選択した後の、ダイアログ「ナビゲーター」の、**[データの変換]**（**黄色い[読み込み]ではない**）や、読み込み後のメイン画面の上部リボンにある**[データの変換]**からPower Query エディター画面を呼び出せます。
　メイン画面に戻るには、[閉じて適用]または、[x]で閉じる時に適用させます。
通常最初に行うのは、Power Queryで、適時行き来します。

### 最初に行うのはPower Query エディター
 データを読み込んだ後、左のPower Query Editorでデータを整える段階が最初。

- 不要な列の削除
- 必要な列の不要データの削除
- 型を整える
- 明らかに必要な列の追加

等、豊富なメニュー等から行い、**事前に整えます**!

最初にこれらを行ってからメイン画面に進むことができますが、**この順が定番**! 
Power Queryでも、DAXでも、どちらでもできることがありますが、原則はこの流れで。

### 進め方のおさらい

0. Power Query エディターでデータを整える
1. ビジュアルを作る
2. 必要に応じて、DAXで計算式やメジャーを作る
3. 1,2の課程を試行錯誤でいろいろ繰り返し、(どうしても必要な場合)0にも戻り微修正する

という流れで可視化を進めていきます。

## メイン画面には3つのビュー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/bfdd2de9-4e10-f08d-5a72-da1f7090d0f3.png)

### メイン画面のどこから?
　[レポート] ビューまたは[データ] ビューでテーブルを選択すると、メニューに[テーブル ツール]が表示され、リボンには「新しいメジャー」等がでてきます。ここでいう「新しい」とは「新規○○」という意味です（What's NewのNewではないイメージ）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/76d45ad2-036c-95a1-41bc-f07a50712363.png)

テーブルの **右クリックのメニューから** もよく使われます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c03a99d1-ec32-59d9-3943-6228f4ac59e3.png)

メニュー[モデリング]から入る方法でもOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/1136171a-0080-967b-bbae-a483b36e9720.png)


### どういった動機でDAXを作るの?

大きく以下の2つがあります。
- **計算列**　テーブルに計算後の新しい列が必要というとき
- **メジャー** テーブルや、特定行のフィルターで、集計等を行うとき

計算列は必ず実行され、メジャーは**ビジュアルで使われるとき**に実行されます。

この表には追加で計算列が欲しい、特別な集計をしたいのでメジャーで...、といった時に作ります。

## 基本的な記載方法

　[Power BI Desktop における DAX の基本事項 - Power BI | Microsoft Docs](https://docs.microsoft.com/ja-jp/power-bi/transform-model/desktop-quickstart-learn-dax-basics)より、DAXの構文はこのようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/7ffb2904-2ba2-8520-19de-f59da79d8bd8.png)

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

もう少しやわららかく表現すると

> " "Total Sales" **というメジャーは** 、Sales テーブル **内の** [SalesAmount]列 **の** 値の合計**を計算する (=)。** "

英語でいうと、

>　**For the measure** named Total Sales, **calculate (=)** the SUM of values **in the** [SalesAmount ] column **in the** Sales table.

### 整形前

　[新しいメジャー]を選択すると以下のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c78532e9-4825-6ba1-aeab-4e7fc0b5acd1.png)

左の「1」は行数を表すもの、「メジャー = 」は既定のメジャー名です。このメジャー名は何か名前を付けるため、[Ctrl]+[A]で全選択をして、○○ = のように書き始めます。

1行でDAXを記載すると以下のようになります。

```text:メジャー名TotalSalesのDAX
TotalSales = SUM(Sales[SalesAmount])
```

### 整形後
　DAXは関数の入れ子ができるので、よく改行やタブを使って整形されます。

```text:入れ子になって整形されたDAX例
Dates = CALENDAR(
        DATE(2019,1,1) ,
        TODAY()
        )
```

閉じ括弧がどことペアになっているか、文字の上にいけばわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/6feca3e9-dd6e-2c03-49f9-78b2e465ca06.png)


### 主なキーボード操作（ショートカット）

- **[SHIFT] + [Enter]**で改行
- [ALT] + [Enter]でも改行
- 必要に応じて[Tab]でインデント（字下げ）
- [Ctrl] + マウスの中ボタンのくるくるでフォント拡大/縮小
- **[Enter]で確定**(間違ってEnterして確定しても直せば、OK)

### インテリセンス(入力の候補だし)

　DAXを途中まで入力すると候補がでてきます。全部覚える必要はないです。

#### 関数の場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/237ed171-ecda-9458-bd46-58fef06e7e3a.png)

#### テーブルの場合

"'"（シングルクォテーション）の入力でテーブルの候補が呼び出されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/78154159-c047-309b-6070-3a91620e95ca.png)

"["で囲まれるのは列名ですね

### コメント

**メジャー名 = の後に** 「// 」を入れた箇所は行末までコメントになります（コメントと認識したところは緑色に）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/59039485-7eed-3b86-8698-3c105c9e204a.png)

このようなルールはプログラミングみたいな感じですね。


## 1行で書ける簡単でよく使うメジャーは??

読み込んだテーブルが何レコードあるか?を知りたいとき、カードのビジュアルに項目を読み込み、「カウント」を選択...、とやってもいいのですが、以下のメージャーをDAXで書いて作ってから、読み込むこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/efa415f1-8a05-3a9a-7249-f68f34ec8b03.png)

日本語で、**メジャー「レコード数」は、Salesテーブルの行数を数える（COUNTROWS）** です。

あと、合計のSUM等ありますね。

## メジャーは値を返す以外に、テーブルも作ってくれます。

メジャーを書くだけでなんとテーブルを作ってくれます。
代表的なものはカレンダーテーブルです。

新しいテーブルはこちらから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/b6b330c0-c21d-6d9b-b052-d90898bedac7.png)

### カレンダーテーブル

カレンダーテーブルの例（ @yugoes1021 さんから教わったもの。深謝。 ）

``` text:カレンダーテーブルの例
カレンダー = 
// テーブル名は「カレンダー」
var BaseCalendar = CALENDARAUTO()
RETURN
    GENERATE(
        BaseCalendar,
        var BaseDate = [Date]
        var YearNumber = YEAR(BaseDate)
        var MonthNumber = MONTH(BaseDate)
        var DateNumber = DAY(BaseDate)
        var DayNumber = WEEKDAY(BaseDate, 1)

        RETURN ROW(
            "年_番号", YearNumber,
            "年", FORMAT(BaseDate, "yyyy"),
            "月_番号", MonthNumber,
            "月", FORMAT(BaseDate, "mm"),
            "年月_番号", FORMAT(BaseDate, "yyyymm"),
            "年月", FORMAT(BaseDate, "yyyy/mm"),
            "月日_番号", FORMAT(BaseDate, "yyyymmdd"),
            "月日", FORMAT(BaseDate, "mm/dd"),
            "日_番号", DateNumber,
            "日", FORMAT(BaseDate, "dd"),
            "曜日_番号", DayNumber,
            "曜日", SWITCH(DayNumber, 1, "日", 2, "月", 3, "火", 4, "水", 5, "木", 6, "金", 7, "土",""),
            "相対月数", DATEDIFF(TODAY(), BaseDate, MONTH)
        )
    )
```

Power BIで表示したところ。色分けもありわかりやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/362b9bf0-497c-476b-12f8-0df4782846e3.png)

テーブルを作れるのは非常に強力ですね。

### よく使うものはテンプレート化して保管を

　前項のカレンダーテーブルを読み込んだ後、日付を「/」表示にする、時刻を除くなど整えます。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/751ecf0f-593e-3827-cbdd-db52c6d0fe64.png)

 また、「○○_番号」で○○を**列で並べ替え**ておくと、曜日等が規則正しく並びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/e9b61fc8-55a3-de01-f5a3-1cc6a5293efb.png)

並べ替えた後、ビジュアルでは使わない「○○_番号」を非表示にします（非表示のものは薄くなります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/0323b0de-8557-84a6-d504-6f79fadf486b.png)

これらを整えた後、時系列を扱うようなものではよく使うので、分析のひな形としてテンプレート保管しておくと便利です。

　Power BIの保管をテンプレート（.pbit）で保管できます。時系列を扱う分析で、毎回作って曜日等の表示順も整えたカレンダーテーブルを呼び出すのが面倒であれが、テンプレートで保管しておきましょう。必要なカレンダーの期間の開始日等はデータによって調整し、原則2年分等長期で持っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c5f335e5-ae28-ea4e-c2f8-61f431491784.png)

保存時メモ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/9162b2f6-aace-7854-4901-caa62231f3a2.png)

テンプレートの呼び出しは、.pbitファイルからの起動または、メニューのインポートから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/5b2d24bf-028d-86eb-2409-f5025f841814.png)

## メジャーの特徴のひとつ「ピンポイントで欲しいデータを特定」
 
　「全体の売上」というSUM('Sales'[SalesAmount])のメジャーを作っておきます。そして、特に注目しているもの（例ではたまたまカテゴリーの「Audio」）をピックアップして絞り込んで、計算し表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/7c4c6c38-3078-73e2-fad7-af72fd704836.png)

## サンプル：日本の人口
　こちらのホームページに、Power BI DesktopのWebで接続して、計算列とメジャーの違いを見てみましょう。

[【ホームメイト】47都道府県別の人口一覧](https://www.homemate.co.jp/research/population/all/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/18625602-7ab4-771e-cef7-9e7782296153.png)

データのクリーニングは、Power Queryで適当に行い、以下のような形となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/2cdb6ffb-1300-f5ad-326a-1d4869dc0dfd.png)

### 計算列を作る

　新しい計算列の「人口順」で、人口ランキングの列を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c2b7d88a-319d-d412-425a-7d1b8a55c8c0.png)

``` text:計算列の人口順
人口順 = 
    RANKX(
        '人口',
        [人口]
    )
```

### メジャーの場合は、フィルターを引き継いでくれる!

　今度はメジャーで作ってみます。

``` text:メジャーの人口順
人口順(メジャー) = 
    RANKX(
        ALLSELECTED('人口') ,
        CALCULATE(
            SUM('人口'[人口]
            )
        )
    )
```

計算列とメジャーの結果は同じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/5425d54d-d605-ad41-9002-7a305f546745.png)

ところが、エリアのフィルターで絞った場合、どうでしょうか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/19e3e68e-6817-07db-1faf-d44b2c70eed5.png)

メジャーはフィルターで絞られたエリアでの順位、計算列ではあらかじめ計算された値を出しているだけなので全体の順位のままです。
このような計算列とメジャーの違いがあります。

## その他、メジャーの特徴

- 関数の入れ子ができる
- 2つのコンテキストがある（行コンテキスト、フィルターコンテキスト）

etc,etc...(ここでは割愛)

## クイックメジャーとは
　1からメジャーを作らなくても、クィックメジャーから項目を選択することで、メジャーのDAXを作ってくれる、それがクイックメジャーです。作られたDAXをカスタマイズすることもできます。

尚、クイックメジャーでできたDAXが最も効率がよいもの、メンテナンス性が高いものとは**限りません**。
方法は数通りあるの原則で、別な書き方を検討していく、いったことが中級的なイメージでしょうか。

参考 [Power BIクイックメジャー「星評価」 - Qiita](https://qiita.com/ishiayaya/items/d003f3dce2f492fbf1b4)

## DAXのリファレンス

- [DAX Guide](https://dax.guide/)
- [DAX 関数リファレンス - DAX | Microsoft Docs](https://docs.microsoft.com/ja-jp/dax/dax-function-reference)
- [Power BI Desktop における DAX の基本事項 - Power BI | Microsoft Docs](https://docs.microsoft.com/ja-jp/power-bi/transform-model/desktop-quickstart-learn-dax-basics)

## 参考ページ等

- @PowerBIxyz さん [メジャー とはなんだろうと考える - Qiita](https://qiita.com/PowerBIxyz/items/94e171e05ef7beb83897)
- @PowerBIxyz さん [DAX Query を記述して メジャーを試す - Qiita](https://qiita.com/PowerBIxyz/items/2dc7f7cfc5501c08fb3c)
- @h_kobayashi1125 さん [【PowerBIメモ】DAX事始め　～計算列とメジャーを理解する～ - Qiita](https://qiita.com/h_kobayashi1125/items/a7533832183ac086b12d)
- 陽子さん [Power BI 初心者さんのDAX・メジャー「モヤモヤ」晴れるまで](https://www.slideshare.net/YokoKomuro/power-bi-dax)

# おわりに
　Microsoft MVP (Power BI) のお二人、 @PowerBIxyz 、 @yugoes1021 さんにPower BI勉強会等で教わり、自習であちこち、MicrosoftのLearnやDocs、YouTube等で学んだことで、ここが最初の一歩だ!と思ったところをまとめてみました。
　正直に言いますと、**DAXなんだかこえ－、要点わかんねー、難しいー**って、半年以上思っていましたw が、2020/07/18に参加した、[Power BI 勉強会 @ 東京 #18 - connpass](https://powerbi.connpass.com/event/180122/)他最近の勉強会で、 @PowerBIxyz さんに教わったり、主に海外のDAXに関する動画を閲覧している内に、だいぶ怖くないなぁ、と思えるように変わってきたところでして、今回のメモを書きました～
　ご参考にしていただけますと幸いです。