雑・Excel入門試論 - 脱VLOOKUPの思考 21 DAX - コンテキストとイテレーター

# DAXとは
　DAXは、計算によって新しい情報を作成できます。エクセルには、様々な関数があり、それを使うことで新しい列をつくることができますが、DAXでは、更に新しい分析手法を提供してくれます。

# 計算列とメジャー
　DAXを使った列の追加には、計算列とメジャーの2種類があります。

　計算列は、行ごとの計算を行うことができ、エクセルのテーブルに列を追加するのと同様です。しかし、ここで追加した列はテーブルには表示されず、列名が「ピボットテーブルのフィールド」に追加されます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/LkwrOe5LhE0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

　メジャーは、行を超えて計算を行うことができます。分析対象となる数値は、計算列ではなくメジャーを使って作成します。作成方法は以下のようになります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/m_fREKgRCyM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# コンテキスト
　メジャーの動作を理解するには、行コンテキスト、クエリコンテキスト、フィルターコンテキストを理解する必要があります。

## 行コンテキスト
　行コンテキストは、"現在の行" を示しています。計算列は、行コンテキストの中で計算されています。先の計算列では以下のような計算が行われました。

```
= financials[Sale Price] * financials[Units Sold]
```
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/836298a7-04d9-9e94-0ba2-026410e52f66.png"/>

　しかし、メジャーで記述する時、この書き方ではエラーになります。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/91fe7ae2-13d5-fb48-617c-f313587b9d76.png"/>

　計算列の場合は1つの行の値しか参照できなかったのですが、メジャーの中では現在の行というものがなく、 `financials[Sale Price]` と `financials[Units Sold]` という記述は列全体を対象としており、1つの値とならないからです。

 値を1つにするために `SUM` を使用してみます。

```
:= SUM(financials[Sale Price]) * SUM(financials[Units Sold])
```
　今度はエラーにはなりませんが、個別の値段の合計と個数の合計をかけ合わせており、明らかに計算が間違っています。

　メジャーで行ごとの計算を行うためには **イテレータ（反復子）** を使用します。

```
:= SUMX(financials, financials[Sale Price]) * SUM(financials[Units Sold])
```

　この`SUMX`は、financialsの行ごとを反復して計算を行ってくれるので、正しい答えを得ることができます。

　また、行コンテキストは、反復処理されるテーブルのカラムに対してのみ適用されます。financialで行コンテキストを作成すると、別のProductsの列にアクセスすることはできません。リレーションシップで結ばれた別のテーブルにアクセスする必要がある場合は、 **RELATED** 関数と **RELATEDTABLE** 関数を使う必要があります。

　ここで注意するところは、行コンテキストはデータをフィルタリングして計算をしているのではないということです。テーブルをフィルタリングして計算するのは、フィルターコンテキストです。

## クエリコンテキスト
　クエリコンテキストとは、数式に対して暗黙的に取得されるデータのサブセットです。ピボットテーブルのセルにメジャーまたは他の値フィールドをドロップすると、PowerPivotエンジンは行と列のヘッダー、スライサー、レポートフィルターを調べてコンテキストを決定します。その後、PowerPivotは必要な計算を行ってピボットテーブルに値を生成します。各セルの計算に使われたデータのセットがクエリコンテキストです。

　例えば、 `=SUM(financials[Profit])` のような単純な数式の場合、ピボットテーブルでは列見出しや行見出し、スライサーを追加したり削除したりすることで簡単にコンテキストを変更できます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/DjlGp-XuJq4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## フィルターコンテキスト
　フィルターコンテキストは、数式の引数で列やテーブルにフィルターを指定すると追加されます。行コンテキストやクエリコンテキストなど、他のコンテキストと合わせて適用されます。

　Microsoftのドキュメントでは、クエリコンテキストとフィルタコンテキストを区別して記述していますが、この2つをあわせて「フィルターコンテキスト」と呼ばれることもあります。


https://support.microsoft.com/ja-jp/office/dax-%E3%81%AE%E6%95%B0%E5%BC%8F%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-2728fae0-8309-45b6-9d32-1d600440a7ad

https://www.sqlbi.com/articles/row-context-and-filter-context-in-dax/

# コンテンツ
- [雑・Excel入門試論 - 脱VLOOKUPの思考 01 - ブック - 仕様と制限](https://qiita.com/spumoni/items/189004c01181c50a4821)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 02 - ブック - オプション](https://qiita.com/spumoni/items/75955db69cc34695de14)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 03 - ワークシート](https://qiita.com/spumoni/items/5408cae114034be528c4)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 04 - セル - 文字列型](https://qiita.com/spumoni/items/4ab1d7067418886c0582)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 05 - セル - 数値データ](https://qiita.com/spumoni/items/970b4b39a5a2185992ed)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 06 - セル - 日時データ](https://qiita.com/spumoni/items/9f270e181fbc45503759)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 07 -  リンクされたデータ型](https://qiita.com/spumoni/items/ed59d15753d992c3a630)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 08 - セル - 計算式・関数](https://qiita.com/spumoni/items/ae339c97627110e2134e)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 09 -  セル - 数値の書式設定](https://qiita.com/spumoni/items/1b3134d4b0284465976f)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 10 - セル - 日付と時刻の書式設定](https://qiita.com/spumoni/items/6eb602f69956a5e1502f)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 11 - セル - 条件付き書式](https://qiita.com/spumoni/items/04bd8e24284daef6f27a)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 12 - テーブル - テーブルの作成と入力規則](https://qiita.com/spumoni/items/f23beca01c5093c81c47)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 13 - テーブル - ソートとスライサー](https://qiita.com/spumoni/items/b66027008c2f9edb853f)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 14 - テーブル - 動的配列関数](https://qiita.com/spumoni/items/cc03e898f02b8c3017f7)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 15 - Power Query - エクセルのデータを読み込む](https://qiita.com/spumoni/items/fc38a4ae595b64af87f5)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 16 - Power Query - 変換](https://qiita.com/spumoni/items/100e0e3c6a5a59b03229)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 17 - Power Query - テーブルの結合](https://qiita.com/spumoni/items/debb9ea9b8692ca8fc8c)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 18 パワーピボット - データモデル](https://qiita.com/spumoni/items/08458978e86dc59f18ed)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 19 パワーピボット - 操作](https://qiita.com/spumoni/items/e7b3f245e87622e9bc79)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 20 パワーピボット - 日付テーブル](https://qiita.com/spumoni/items/340e0fcbc9cd10198112)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 21 DAX - コンテキストとイテレーター](https://qiita.com/spumoni/items/cddc7fa16341e20bafb8)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 22 DAX - CALCULATE](https://qiita.com/spumoni/items/e2218fece1ec01e177b0)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 23 DAX - タイムインテリジェンス](https://qiita.com/spumoni/items/6d8aeb9f80ecafb69c5a)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 24 - ダッシュボード - ピボットグラフ（Pivot Chart）](https://qiita.com/spumoni/items/ffb0d57a6272c2e5ad37)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 25 - ダッシュボードの作成](https://qiita.com/spumoni/items/5e57ad587a343857e543)