「メジャー」と「計算列」と「計算テーブル」の違い
はじめに
Power BIの中で、同じくDAX関数で作成できる要素として、「メジャー」と「計算列」と「計算テーブル」の3種類があるが、それぞれの挙動やDAX関数の使い方に違いがある。
「メジャー」と「計算列」と「計算テーブル」の簡単な比較
比較表
比較項目 | メジャー | 計算列 | 計算テーブル |
---|---|---|---|
値の保存 | データセットに保存されない | データセットに保存される | データセットに保存される |
計算タイミング | 使われるタイミング 例:ビジュアルの表示時 |
データセット更新時 | データセット更新時 |
DAXコードの出力値の型 | スカラー値[1] | スカラー値 | テーブル |
機能自体の型 | スカラー値 | 列 | テーブル |
モデル上の配置 | 任意のテーブル内 | 関連のテーブル内 | 他のテーブルと同列 |
名前の制限 | 全レポートの列名と他のメジャー名と被ってはいけない | 同テーブル内の他の列名とメジャー名と被ってはいけない | 他のテーブル名と被ってはいけない |
列参照である必要の場所への設定 ※スライサー等 |
不可 | 可能 | テーブル内の列は可能 |
リレーションシップのキーとして使う | 不可 | 可能 | テーブル内の列は可能 |
同テーブル内の各列の値の取得 | SELECTEDVALUEで取得する必要がある | 同レコードの値は列名の指定で直接取得できる | - |
RELATED関数 | 直接使えない SUMXなど、テーブルを評価対象とする関数内でのみ使える |
直接使える | - |
動的書式 | 使用可能 | 使用できない | 使用できない |
使い分けの考え方
メジャーを使った方がいい場合
- テーブルの列数が増えてデータセットの容量が増加するのを避けたい場合
※特にデータ量が元から非常に巨大な場合 - レポートの表示時間よりもデータセットの更新時間が気になる場合
- 計算ロジックが複雑で列で追加する場合、構成を考えるのが面倒な場合
- 動的に書式を変更したい場合
計算列を使った方がいい場合
- スライサーなどの列参照が必要な設定に使いたい場合
- リレーションシップのキーとして使いたい場合
- データセットの更新時間よりもレポートの表示時間が気になる場合
- 行単位で計算した方がいい場合
計算テーブルを使った方がいい場合
- 日付テーブルや集計テーブルなど、テーブルとして追加したい場合
機能の詳細比較
メジャー
作成方法は下記を参照。
メジャーの主な特徴は以下である。
1. 値がデータセットに保存されず、使われるタイミングで計算される
メジャーの計算結果はデータセットに保存されない。ビジュアルがメジャーを使って計算している場合、データセットの更新ではなく、各ユーザーがレポートページを開くなどの時に計算される。
またその場合、メジャーの計算結果はキャッシュに保存されるだけで、ブラウザーのページを更新などすると再度計算し直すことになる。メジャーの数が多い、計算が重いなどの場合はレポートの表示に時間がかかってしまう。
2. メジャーの出力値はスカラー値のみ
メジャーはスカラー値のみを出力できる。従ってCALCULATETABLEやSUMMARIZEなど、テーブルを返す関数の戻り値をRETURNに設定することができない。
ただし、メジャー内でテーブル型の変数を定義し、それに対し更に集計したスカラー値をRETURNすることができるので、CALCULATETABLEやSUMMARIZE関数が使えないわけではない。
3. 列参照が必要なビジュアルの設定欄に設定できない
メジャー自体がスカラー値であるため、スライサーの「フィールド」欄や、フィルターパネルなど、列参照が必要なビジュアルの設定欄に設定することができない。
同様にメジャーをMAX関数の引数など、列やテーブル参照でないといけない引数として使うことができない。
4. リレーションシップのキーとして設定できない
メジャーはPower BIのモデルビューで列と一緒に一覧に表示されるが、列ではないため、リレーションシップのキーとして使うことができない。
5. 親テーブルとの関連性は特にない
メジャーは基本的にどれかのテーブルの下に配置する必要があるが、その親テーブルとの関連性は特になく、機能は完全にメジャーのコードに依存する。
ただし、同じテーブルのフィールドを呼び出す時、テーブル名を指定する必要がなくなる。(その場合、他のテーブルの下にメジャーを移すとエラーになる。)
6. レポート内で名前がユニークである必要がある
メジャー名は全レポートの列名と他のメジャー名と被ってはいけない。これに連れて、メジャー内で任意のメジャーを呼び出す時、テーブル名を指定する必要はなく、[メジャー名]
で直接呼び出すことができる。(テーブル名を書いても問題ない)
7. 列の直接参照とRELATED関数の直接使用ができない
スライサー等のフィルターで特定のテーブルを1行になるようにフィルタリングしても、そのテーブルのフィールドを直接参照してスカラー値を取得することができない。またRELATED関数も直接使うことができない。
特定のセルのスカラー値を取得したい時、SELECTEDVALUEを使う必要がある。RELATED関数はSUMXやADDCOLUMNS関数の中など、評価するレコードが(明示的なフィルタリングなしでも)特定できる場合でのみ使える。
//テーブルFactOrderに列OrderID、CustomerName、ProductID、OrderedNumberが存在し、
//テーブルDimProductに列ProductID、ProductName、ProductWeightが存在し、
//FactOrderとDimProductはProductID同士でリレーションシップを繋げているとする。
Measure = FactOrder[OrderID]
//スカラー値を取得できず、エラーになる
Measure = SELECTEDVALUE(FactOrder[OrderID])
//正常にスカラー値を取得できる
Measure = SELECTEDVALUE(FactOrder[OrderedNumber]) * RELATED(DimProduct[ProductWeight])
//有効なリレーションシップを見つけられず、エラーになる
Measure = SUMX(
FactOrder,
FactOrder[OrderedNumber] * RELATED(FactOrder[ProductWeight])
)
//正常に計算できる
8. 同じコードでも、計算列でと違う計算結果を得られるケースがある
例えばメジャーの場合、RANKXの引数1のテーブルにALL()を付けないと、結果が全部1になるが、計算列の場合、引数1のテーブルにALL()を付けなくても正しい順番値が返ってくる。
9. 動的書式が使える
2023年4月リリース以降、動的書式が使える。
計算列
作成方法は下記を参照。
計算列の特徴は主に以下である。
1. 値はデータセットに保存され、データセット更新時に計算される
計算列の値はデータセットに保存されるので、データセットを更新するタイミングで値が計算される。そのため、レポートを開いたり、ブラウザーを更新したりしても再計算されず、素早く結果を得ることができる。
2. 出力値はスカラー値でなければいけない
計算列のDAX式はそのテーブルの各行に対し出力値を計算するため、メジャーと同様、スカラー値を返す必要がある。
3. 列参照が必要なビジュアルの設定欄に設定することができる
計算列自体は列なので、スライサーの「フィールド」欄や、フィルターパネルなど、列参照が必要なビジュアルの設定欄に設定することができる。またMAX関数の引数など、列やテーブル参照でないといけない引数として使うこともできる。
4. リレーションシップのキーとして使うことができる
普通のフィールドと同様、計算列はリレーションシップのキーとして使うことができる。
5. 列名は同テーブル内でユニーク
列名は同テーブル内の他の列名とメジャー名と被ってはいけない。
これに連れて、別のテーブルの計算列を参照する時、テーブル名を指定する必要がある(普通のフィールドと同じ仕様)。
6. 列の直接参照とRELATED関数の直接使用ができる
同じテーブル内に限って、既存のフィールドを直接参照してスカラー値を取得できる。同様にRELATED関数も直接使える。
7. 同じコードでも、メジャーと違う計算結果を得られるケースがある
例えばメジャーの場合、RANKXの引数1のテーブルにALL()を付けないと、結果が全部1になるが、計算列の場合、引数1のテーブルにALL()を付けなくても正しい順番値が返ってくる。
8. データビューで値を直接確認できる
データビューで該当テーブル上に列として表示されていて、すべての行の値を直接確認できる。
9. 動的書式が使えない
2023年4月リリース時点で動的書式はメジャー専用の機能なので、動的書式を使いたい場合はメジャーを使う必要がある。
計算テーブル
作成方法は下記を参照してください。
計算列のテーブル版である。
DAXで作成したテーブルであること以外は、Power Queryでインポートなどした普通のテーブルと同じ仕様である。
参考
-
スカラー値:テーブルや列ではなく、単一の値 ↩︎
Discussion