DAX Query を記述して メジャーを試す

DAX Query で Power BI や SSAS(SQL Server Analysis Service)、PowerPivot for Excel など xVelocity メモリ内分析エンジン(xVelocity in-memory analytics engine) を使用するデータベースからデータ検索することができる。Power BI Desktop でのモデリング(メジャーやテーブルの追加など)の作業をするとき、[DAX Studio](http://daxstudio.org/) で試行錯誤しながら作業することもできるし、DAX を学習することにとても役立つ。


# 構文など基本的なこと
構文はとてもシンプル、DEFINE / EVALUATE のふたつだけ。あとは DAX 関数を理解するだけ。
DEFINE で メジャーを定義して、EVALUATE で 評価する 簡単なおシゴト

- [DAX Queries | Data Analysis Expressions (DAX) Reference](https://msdn.microsoft.com/en-us/library/gg492201.aspx)


## EVALUATE
```text:構文：EVALUATE
EVALUATE
    <table>  // テーブル名 もしくは テーブル式

[ORDER BY
    <expression> [{ ASC | DESC }]}[, …] ] // 列 もしくは 式 
```
EVALUATE で得られる結果は テーブル のみなので、テーブル名 もしくは テーブルを返す式を記述

### テーブルを指定
```text:例1
EVALUATE
    '商品'
```

```sql:例1：SQLで表現すると
SELECT * FROM '商品'
```

得られる結果にソートを指定する場合 ORDER BY で指定

```text:例2
EVALUATE
    '商品'
ORDER BY
    '商品'[区分ID] ASC    
```

```sql:例2：SQLで表現
SELECT * FROM '商品' ORDER BY '商品'[区分ID] ASC
```

### テーブル式
テーブルを返す式を記述する。結果にテーブルを返す関数
SELECTCOLUMNS
ADDCOLUMS
SUMMARIZE
SUMMARIZECOLUMNS
FILTER
VALUES
で、ひとまずこと足りるかと。よくつかう関数なのでおのずと覚えてしまいますけど。

#### 列の選択
```text:例3：列の選択
EVALUATE
    SELECTCOLUMNS(
        '商品'
      , "商品ID", '商品'[商品ID]
      , "商品名", '商品'[商品名]
    )
```

```sql:例3：SQLで表現
SELECT
    '商品'[商品ID] as "商品ID"
  , '商品'[商品名] as "商品名" 
FROM
    '商品'
```
#### 列の追加
```text:例4：列の追加
EVALUATE
    ADDCOLUMNS(
        '商品'
      , "区分ID-区分名", '商品'[区分ID] & "-" & '商品'[区分名]
    )
```

```sql:例4：SQLで表現
SELECT
    *
  , '商品'[区分ID] & "-" & '商品'[区分名] as "区分ID-区分名" 
FROM
    '商品'
```

#### 集計
```text:例5：集計
EVALUATE
    SUMMARIZE(
        '商品', '商品'[区分ID]
      , "Count of 商品", COUNTROWS( '商品' )		
    )
```

```sql:例5：SQLで表現
SELECT
    '商品'[区分ID]
   , COUNT(*) as "Count of 商品"
FROM
    '商品'
GROUP BY
    '商品'[区分ID]
```

#### 条件
```text:例6：条件
EVALUATE
    FILTER(
        '商品',
        '商品'[区分ID] = 1
    )
```

```sql:例6：SQLで表現
SELECT
    *
FROM
    '商品'
WHERE
    '商品'[区分ID] = 1
```



## DEFINE
セッション内で利用できる メジャー(measure) と変数(named variable)は DEFINE 句 で定義
### MEASURE
```text:構文：MEASURE
MEASURE
    <tableName>[measureName] = <expression>
```
### VAR
```text:構文：VAR
VAR <varName> = <expression>
```

# いくつかの例
## 日付テーブル
```text
EVALUATE
    ADDCOLUMNS(
        CALENDARAUTO()
      , "年", YEAR( [Date] )
      , "年月", FORMAT( [Date], "yyyy年mm月" )
      , "月", YEAR( [Date] )
      , "年度"
      , SWITCH( 
            TRUE()
          , MONTH( [Date] ) < 4, YEAR( [Date] ) -1
          , YEAR( [Date] ) 
        )
    ) 
```

## メジャーの定義と結果
```text
DEFINE
    MEASURE
    '受注'[受注額] = SUMX( '受注', [数量] * RELATED( '商品'[単価] ) )
    
    MEASURE
    '受注'[受注額 LY] = CALCULATE( [受注額], SAMEPERIODLASTYEAR( 'カレンダー'[Date] ) )

    MEASURE
    '受注'[受注額 vs LY] = DIVIDE( [受注額], [受注額 LY] )

EVALUATE
    SUMMARIZECOLUMNS(
        'カレンダー'[年月]
      , "受注額", [受注額]
      , "受注額 LY", [受注額 LY]
      , "受注額 vs LY", [受注額 vs LY]
    )
```

EXCEL ワークシートに出力とかでもできるので DAX Studio 使うとよいですよ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/d3825223-0a04-bf48-3a53-a59cfe7b6923.png)

# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [DAX Studio とは](https://qiita.com/PowerBIxyz/items/ddcb3044fdbe4272dbd3)