【PowerBI】仮想的なリレーションシップを作るTREATAS関数について

【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('地域マネージャー'[地域]),
        'オーダー'[地域]
    )
)

式の解説

  1. VALUES('地域マネージャー'[地域]) :スライサーで選択された「地域マネージャー」テーブル内の地域のリストを取得します。
  2. TREATAS(
    …,
    'オーダー'[地域] )
     :取得した地域のリストを「オーダー」テーブルの「地域」列にそのままフィルターとして使います。

3.結果

マトリックスビジュアルの行に「地域マネージャー」テーブルの「地域」列を選択し、値には先ほど作った売上を地域別に集計するメジャーを入れます。

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

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

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

まとめ

TREATASは、データモデルの制約を超えて柔軟に集計を可能にする便利な関数です。

ただ、物理的なリレーションシップより若干処理負荷が高くなる場合がありますので、基本は物理的なリレーションシップを優先します。

既存のモデルに影響を与えずに計算だけを行いたい場合、ぜひTREATAS関数を活用してください。

 

BI製品のサポートはぜひKCMEで!

自然言語を使って簡単にデータの可視化ができるBIツール、ThoughtSpotの詳細はこちら

おすすめの記事