別データソースの社員マスタからプライマリのデータの部門制御をする

お題目はいいからという方は線の下から読んでください。

 例えばtableauserverにワークブックを全社公開したとします。
 全社員が閲覧する画面のため、全社員が閲覧可能な情報に加工しなければならない、という条件が発生します。
 つまり、部署のレベルを削除して集計して全社の合計を算出した画面を見せることになる、ということです。

 ただ、実際の現場では部署のレベルが入った状態の画面を見たい人(経営陣)や、自部署のデータのみ見せるべき人(一般社員)、自部署のみでなく別部署のデータを見たい人(兼務区分がある社員)、と様々な立場の人物がいます。
 とは言え、全員に向けて部署のレベルが入ったデータを公開できないので、tableauserverの管理しているプロジェクトを分けてパーミッションを設定し、参照しているデータソースを変更した同一のワークブックを大量生産する必要があります。(まことに管理が面倒なものです)
 面倒な作業を減らすべく、一助となればと思い推敲します。

 部署レベルが入ったデータを制御する場合を考えます。

よくある売上データ

 部署のレベルが入っているデータを参照してダッシュボードを作成する場合考えられる制御は何でしょうか。それはURLパラメータを使用してURLの最後に「部署='AA'」といった具合に指定する方法です。
ビュー URL の構築方法 - Tableau
 これなら部署のデータを変更できます、が、パラメータを変更すれば誰でも表示できてしまうため望ましくないです。
 よって、URLパラメータを指定したと同時にデータソースをフィルタ出来る仕組みを構築しなければならないです。

よくある社員マスタ

 安直に考えられるものとして、データに部署をキーとして社員マスタを結合する方法がありますが、この方法はデータ量が社員分膨れる点で取れないです。
 ブレンドを使用する方法もあって、以下の通り、
  ① 社員マスタから作成したデータソースに、
     username()=[メールアドレス]
   の条件をデータソースフィルタで使用する。
    → 一行もしくは兼務の部署分行が生成される。
  ② 売上データの部門と社員マスタの部門が一致する条件で
   ブレンドを設定する。
    → 兼務を含めた、自分が所属している部署以外はNULLになる
     ためワークシートフィルタでフィルタする。
というやり方ができますが、これは望ましくないのです。
 URLパラメータはクエリパイプライン上、コンテキストレベル
で動作します。(以下参考)
URLパラメータによるダッシュボードのフィルタ仕様を理解する #Tableau - Qiita
 自分が調べた限りですが、ブレンドのデータソースのフィールドのフィルタはコンテキストよりも低いレベルでしか動作しません。
 つまり、フィルタのかかり方としては
  ① URLパラメータのフィルタ
  ② ブレンドのフィールドのフィルタ
という順番になり、プライマリデータソースが読み込まれてから、プライマリデータソースに他事業部のデータを見せないフィルタがかかるため、
表示上は白紙のシートになるものの、画面上に表示するプルダウンメニュー等のフィルタに、ガッツリ他事業部のデータが乗ってきます。
(画面は各自で確認してみてください。残念なことになります。)
 なので使用できません。



 ここから本題で、パラメータのみを用いてデータを制御する方法を紹介。

前提条件
 使用する環境
  Tableau Desktop
  (Prepが使用できないことも考えられるため)
 使用するDBの想定
  各種DWHに入っているテーブルを参照しSQLを記載できる環境
   → 自分が対応したのはMySQLの環境
 使用するテーブル
  ① 担当者の名前、部署の売上データ

ここでは例としてサンプルスーパーストアを使用しているが、都道府県を部署に書き換えた

  ② 社員マスタ

メールアドレスはtableau publicのものが出てしまうのでマスク

 作成したデータソースの数
  3つ
 
ワークブックを公開する場所
  Tableau Server
   → username()を使用するとメールアドレスが返却される
    ものとする
     返却される値がメールアドレスでなくても別のフィールドを使用
    して条件を設定すればOK

 実際にやった方法は以下の通りです。
 (1) 社員マスタからデータソースを作成し、username()を条件に
  行レベルセキュリティをかける


「本来なら…」の記述にある通りフィルタをかければ自所属のみに行が取り出せる
フィルタをかけたところ

 このデータソースを使用してパラメータを作成します。
 これはダッシュボード等の画面上に出すパラメータです。

リストを動的に変更するため、ワークブックが開いている場合のフィールドを設定

(2) 続いて部署名をカンマ区切りでつなげたリストのデータソース
 作成します
 → MySQLならgroup_concat関数を使用してください。
   SQLServerでも、同様のSQLを作成できます。
  MySQL :: MySQL 8.0 リファレンスマニュアル :: 12.20.1 集計関数の説明

1カラムに自所属がカンマ区切りで入っている

   SQLを使えない環境だと少々加工が必要になりますが、
  上のような形のデータが作成できればOKです。
   フィルタの設定は社員マスタにした方法と同様です。

ここまでは同じ

   カンマ区切りのデータソースを使用して、計算フィールドを
  作成します。

KTがDataSaberで言っていた「マジックリボン」で囲う
→ データソースの固有の値が取得できる
(例えデータソースに一行しか生成されていなくても、
ただのMAX関数はワークブックを開いた値に設定できないのでNG)

   [部署羅列]を使用してパラメータを作成します。
   これはあくまで私見ですが、作成するのはただのパラメータなので、
  パラメータ名に乱数を指定しておくとセキュリティ的に良いのでは、
  と思います。

リストでなくすべての値を許容しておく

(3) 最後に売上のデータを投入し、データソースフィルターの
 条件を設定していきます。
  おさらいですが、カンマ区切りのパラメータは、ログイン者が
 所属する部署のリストをカンマ区切りで一つの文字列にしたものです。
  つまり、部署のパラメータをURLパラメータで設定する際に、
 自分が所属していない部署を指定したときは、その値はカンマ区切りの
 パラメータには含まれていないことになります。
  この性質を利用したのが以下のフィルタで、売上データのデータソース
 フィルタに入れておけば、
  ・ 部署の切り替えパラメータを選択すると値が取り出せる
  ・ 自所属以外をURLパラメータで指定してもデータが表示されない
 ようになります。

収まっていないが計算式は以下の通り

CONTAINS([カンマ区切りのパラメータ],[部署 のパラメーター])
and
[部署]=[部署 のパラメーター]

結論
 ・ 複数データソースで複数部署の制御は可能
 ・ こんな制御をtableauにやらせるな

以上です。部門制御で苦しんでいる方の解の一つになれば嬉しいです。

この記事が気に入ったらサポートをしてみませんか?