DAX workout - 日付テーブルは特別扱い

日付テーブルは特別なディメンジョンテーブルなのでそれなりの扱いを受けている。

# 日付テーブルに関する特別な動作

知らなくてもメジャーを記述できるけれど、フィルタ コンテキストの動作を理解しようとするとき不思議に思うことがあるでしょう。
```text:DAX クエリ
EVALUATE
SUMMARIZECOLUMNS(
    Dates[YearMonth],
    "Sales amount", [Sales amount],
    "Sales amount PM",
        CALCULATE(
            [Sales amount],
            PREVIOUSMONTH( Dates[Date] )
        )
)
```
この DAX クエリは YearMonth ごとにメジャー [Sales amount] と [Sales amount PM] を評価してテーブルとして結果を返す。 
|YearMonth|Sales amount|Sales amount PM|
|:--|--:|--:|
|2020年1月|820,900||	
|2020年2月|1,250,100|820,900|
|2020年3月|830,900|1,250,100|
|2020年4月|987,300|830,900|
|2020年5月|987,300|987,300|
|2020年6月|803,400|987,300|
|2020年7月|971,400|803,400|
|2020年8月|1,017,800|971,400|
|...|...|1,017,800|

結果テーブルの "2020年3月" の行では メジャー [Sales amount] は 2020-03-01 ~ 2020-03-31 の日付の範囲で評価されているのはすぐさま理解できているはずだ。
```text:Measure
Sales amount PM =
    CALCULATE(
        [Sales amount],
        PREVIOUSMONTH( Dates[Date] )
    )    
```
そして [Sales amount PM] は先月の [Salse amount] を得るメジャーで、CALCULATE 関数の *`<filter>`* パラメータには PREVIOUSMONTH 関数(タイム インテリジェンス関数)を利用している。"2020年3月" の行では、2020-02-01 ~ 2020-02-29 の日付だけが含まれる Dates[Date] 列 1列だけのテーブル フィルタである。
では、メジャー [Sales amount PM] の評価にも "2020年3月" の行ゆえに適用されるはずのフィルタ コンテキストの一部(Dates[Date] : 2020-03-01 ~ 2020-03-31)はどこ行ってしまったんだいと🤔 Dates[Date] が 2020-03-01 ~ 2020-03-31 であり 2020-02-01 ~ 2020-02-29 であるという日付は存在しないけれども、[Sales amount PM] の評価結果が BLANK にならないのはなぜなんだいと🤔

タイム インテリジェンス関数を利用していなくても同じ動作を確認できる。
累積を集計するため、CALCULATE 関数の *`<filter>`* パラメータには `Dates[Date] <= MAX( Dates[Date] )`
```text:DAX クエリ
EVALUATE
SUMMARIZECOLUMNS(
    Dates[YearMonth],
    "Sales amount", [Sales amount],
    "Sales amount RT",
        CALCULATE(
            [Sales amount],
            Dates[Date] <= MAX( Dates[Date] )
        )
)
```
```text:DAX クエリ
EVALUATE
SUMMARIZECOLUMNS(
    Dates[Year],
    "Sales amount", [Sales amount],
    "Sales amount RT",
        CALCULATE(
            [Sales amount],
            Dates[Date] <= MAX( Dates[Date] )
        )
)
```
評価軸が Dates[YearMonth] / Dates[Year] と変わっても、引き続き累計された結果が得られる。

要はこういうこと。
ディメンジョンテーブルが日付テーブルとして認識されると自動で行われる所作。CALUCLATE 関数の動作を変更する関数のうち、REMOVEFILTER 関数が自動的に適用されている。だって、ほとんどの場合で必要になるでしょ。
日付テーブル以外のディメンジョンテーブルの場合はこうはならない。

```text:Measure
Sales amount PM =
    CALCULATE(
        [Sales amount],
        PREVIOUSMONTH( Dates[Date] ),
        REMOVEFILTER( Dates )    // 自動的に適用されている状態
    )
```
```text:Measure
Sales amount RT =
    CALCULATE(
        [Sales amount],
        Dates[Date] <= MAX( Dates[Date] ),
        REMOVEFILTER( Dates )    // 自動的に適用されている
    )
```

https://learn.microsoft.com/en-us/dax/removefilters-function-dax

```text:Syntax
REMOVEFILTERS([<table> | <column>[, <column>[, <column>[,…]]]])
```
https://learn.microsoft.com/en-us/dax/calculate-function-dax

```text:Syntax
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])
```
*`<filter>`* パラメータで使用できるのは次の式
- Boolean filter expressions
- Table filter expressions
- Filter modification functions 👈これ

# 思ったこと🙄
フィルタ コンテキストの説明はできるのに日付テーブルに関する特別な動作について説明できないひと、意外と多い。

# その他
https://powerbi.connpass.com/

- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)