日付テーブル は必要か、それが問題だ

引き続き、タイトルは勢いです。でも、日付テーブルが必要かどうかと聞かれたら **日付テーブルは必要** と答えます。
収集したデータを Power BI Desktop でデータモデル化するとき、様々なデータの種類なかで特に重要な項目になる "日付" について。月ごとや年度ごとの集計や前年前月との比較などをシンプルに実施するには "日付テーブル" が必要になる。

# 日付テーブルとは
- 集計対象となる日付をすべて含み
- **連続した日付**の列を持つ

|日付|
|:--:|
|2010/01/01|
|…|
|2017/11/01|
|2017/11/02|
|2017/11/03|
|…|
|2018/12/31|

一般的に利用される年や月などの表記ができるよう日付テーブルの列として追加して使うことになる。
ファクト テーブル上の日付に関する列とのリレーションシップを設定されたディメンジョン テーブルとして使います。

![1](https://qiita-image-store.s3.amazonaws.com/0/193509/57521747-3ae3-2c47-3212-30043f7a1cfc.png)

![2](https://qiita-image-store.s3.amazonaws.com/0/193509/cae898e7-eb49-060f-ef5d-008a993d92c3.png)

*"カレンダー テーブル" と表現されていることも多いかな。 Power BI Desktop にある表記にあわせて"日付テーブル"としておきます。*

# 日付テーブルを用意するいくつかの理由

## 任意の集計範囲に利用
年や月、年度、週など一般的なものから業務独自の期間で集計するとき、日付に対応する値を日付テーブルの **列** として追加すればよい。

|日付|年|年月|月|日|
|:--:|:--:|:--:|:--:|:--:|
|2017/11/01|2017|2017-11|11|1|
|2017/11/01|2017|2017-11|11|1|
|2017/11/01|2017|2017-11|11|1|
|...|...|...|...|

用意した日付テーブルの列、"年" と "月"をマトリクスの [行] と [列] に、[値] に "金額"列を配置すると、既定の計算(暗黙的なメジャー、ここではSum)で集計される。

![3](https://qiita-image-store.s3.amazonaws.com/0/193509/1d9cbba1-0f24-a609-c435-c607253c2d8c.png)

## 複数のメジャーをひとつのビジュアルに表示
![4](https://qiita-image-store.s3.amazonaws.com/0/193509/cd9a863b-faa7-3d47-7dbb-0c3c71f51f58.png)

|ID|受注日|締切日|金額|
|:--:|:--:|:--:|:--:|:--:|
|1|2017/09/01|2017/10/31|\5000|
|2|2017/10/01|2017/11/30|\8000|
|3|2017/11/01|2017/12/31|\10000|
|...|...|...|...|
という、受注テーブルがあり、
例えば、"受注日"で集計できる金額を "売上額"、"請求日"で集計できる金額を "請求額"としたとき、"売上額"と"請求額" を 日付を軸にしたグラフにそれぞれを並べ比較したいとき。

```text:メジャー：受注額
受注額 = SUM( '受注'[金額] )
```

```text:メジャー：請求額
請求額 = 
CALCULATE(
	SUM( '受注'[金額] ),
	USERELATIONSHIP( 'カレンダー'[日付], '受注'[締切日])
)
```
というメジャーと"受注日","締切日"それぞれと "日付"列 とのリレーションシップが必要。
![5](https://qiita-image-store.s3.amazonaws.com/0/193509/afd10150-0884-cb35-d0c5-711d829750a1.png)


## タイムインテリジェンス関数 (DAX)
累計や比較など様々な時系列集計を簡単にしてくれる[タイムインテリジェンス関数(DAX)][DAXTI]を使うときに必要だから。

# すでに用意されていることもある
## Power BI Desktop の機能 - タイム インテリジェンス

![6](https://qiita-image-store.s3.amazonaws.com/0/193509/e2f449f4-d472-643a-81a3-7aebf7b57903.png)

![7](https://qiita-image-store.s3.amazonaws.com/0/193509/5a2620a6-2deb-bc2c-6b45-fca354570ccb.png)


日付を表す列 を 例えば テーブル ビジュアルに配置したとき、階層が設定された 年 / 四半期 / 月 / 日 の列が用意されます。これは、中の人が用意してくれた "日付テーブル" です。集計に使用したい日付列がひとつだけであればそのまま使うのも便利です。[タイム インテリジェンス関数(DAX)][DAXTI]で利用できますし、クイックメジャーもサポートしています。

階層になっているのでいったんすべての列が表示されますが、外していくことで希望する範囲での集計は可能でしょう。ただ、月表示や範囲をカスタマイズができない仕様。

[DAX Studio][daxstudio] でデータモデルを参照するとその構造は確認できます。
![2017-11-25_15-53-35.png](https://qiita-image-store.s3.amazonaws.com/0/193509/bcddcb66-d4f2-d70e-d56a-c7bbef94275b.png)

## 日付テーブルを用意したらどうなるか
Power BI Desktop の タイムインテリジェンス機能が有効の状態で、独自の日付テーブルを用意し 任意の日付列 とリレーションシップを構成した場合、中の人が用意してくれた日付テーブルはどうなるか。このとき、独自の日付テーブルを優先し、中の人が用意した日付テーブルは削除されます。ここまではよし。
ですが、独自の日付テーブルにも 日付列 が存在するので中の人は新たに日付テーブルを用意します。データモデル内で様々な集計をしていくうえでさほども支障は発生しませんが、この挙動を抑止するには Power BI Desktop の オプションから タイム インテリジェンス 機能を無効にする必要があります。

# 情報
- [タイム インテリジェンス関数 (DAX) | MSDN][DAXTI]
- [Dax Studio | Dax][daxstudio]

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

[daxti]:https://msdn.microsoft.com/ja-jp/library/ee634763.aspx
[daxstudio]:http://daxstudio.org/