
【PowerBI】仮想的なリレーションシップを作るTREATAS関数について
こんにちはMJです!
Power BIでレポートを作成していると、「テーブル間に物理的なリレーションシップがないけれど、特定の値をフィルターとして使いたい」という場面があります。
通常、Power BIではデータモデル内のリレーションシップに従ってフィルターが動きますが、TREATAS関数を使えば、仮想的なリレーションシップを作ることが可能です。
今回は、このTREATAS関数についてご紹介します。
TREATAS関数とは?
TREATAS関数は、あるテーブルの結果を、リレーションシップがない別のテーブルの列にフィルターとして適用する関数です。
TREATAS(table_expression, <column>[, <column>[,…]]} )
- table_expression:フィルターとして使用する値のリスト(通常はVALUES関数を利用して一意の値が返された列を使用)
- column:フィルターが適用される対象テーブルのカラム
サンプル
1.シナリオの紹介
今回のサンプルデータには、以下の2つのテーブルがあります。
・オーダー(ファクトテーブル):売上データが格納されています。
| オーダーID | オーダー日 | 地域 | ・・・ | 売上 |
| JP-2021-103884 | 2021年3月11日 | 関東地方 | 16,338 | |
| JP-2021-103912 | 2021年3月24日 | 関西地方 | 3,735 |
・地域マネージャー(マスタテーブル):各地域の担当マネージャー名が格納されています。
| 地域 | 名前 |
| 中国地方 | 雨宮 武 |
| 中部地方 | 辻岡 美羽 |
| 九州 | 矢幡 翔太 |
| 北海道 | 宮前 誠 |
| 四国 | 川波 結菜 |
| 東北地方 | 駒田 静香 |
| 関東地方 | 中吉 孝 |
| 関西地方 | 金児 皐 |
| 関東地方 | 伊藤 豊 |
| 関西地方 | 村田 英樹 |
「オーダー」テーブルと「地域マネージャー」テーブルは「地域」カラムでリレーションシップを作ることができますが、1つの地域に複数のマネージャーが存在している今回のデータの場合、「多対多」リレーションシップで構成されます。
モデルが複雑になりがちな「多対多」リレーションシップですが、仮想的なリレーションシップを利用するTREATAS関数を用いてメジャーを作成してマネージャー名をフィルターとして地域別の売上を集計するメジャーを作成してみます。
2.TREATAS関数を使ってDAXメジャー作成
「地域マネージャー」テーブルの[地域]や[名前]をスライサーとして使用した際に、正しく「オーダー」テーブルの売上が集計されるように、以下のメジャーを作成します。
地域別売上 =
CALCULATE(
SUM('オーダー'[売上]),
TREATAS(
VALUES('地域マネージャー'[地域]),
'オーダー'[地域]
)
)
式の解説
VALUES('地域マネージャー'[地域]):スライサーで選択された「地域マネージャー」テーブル内の地域のリストを取得します。TREATAS(:取得した地域のリストを「オーダー」テーブルの「地域」列にそのままフィルターとして使います。
…,
'オーダー'[地域] )
3.結果
マトリックスビジュアルの行に「地域マネージャー」テーブルの「地域」列を選択し、値には先ほど作った売上を地域別に集計するメジャーを入れます。

「地域マネージャー」テーブルの「名前」列でフィルタリングする前に動作を確認してみたいので、「名前」、「地域」列を入れたテーブルを用意します。

「地域マネージャー」テーブルの行を選択すると、物理的なリレーションシップを持たない2つのテーブルですが、マトリックスが選択した地域にフィルターされました。

そして、「地域マネージャー」テーブルの「名前」を入れたスライサーも同様に正しく動作しました。

まとめ
TREATASは、データモデルの制約を超えて柔軟に集計を可能にする便利な関数です。
ただ、物理的なリレーションシップより若干処理負荷が高くなる場合がありますので、基本は物理的なリレーションシップを優先します。
既存のモデルに影響を与えずに計算だけを行いたい場合、ぜひTREATAS関数を活用してください。
運営会社
