Tableauで動的にテーブルを読み込むには

Tableauで動的にテーブルを読み込むには | Tableau-id Press -タブロイド-

こんにちは。truestar工房の三村です。

今回はTableauの参照元データがデータベースの場合、
初期SQLとカスタムSQLで、一時テーブルや動的テーブルを使うと
より柔軟にワークブックが作成できるよってお話です。

まずはTableauで一時テーブルを使ってみよう!

Tableauでデータベースからテーブルを読み込むときに、
・Joinやら絞込やらいろいろデータ加工したものをデータソースとして読み込みたい!
・バリバリSQLで引っ張ってきたいんだよ…
・もしくは、仕様書がSQLだった…これ、置き換えるの大変だわ…
ってときは初期SQLを使いましょう。

複数のデータソースを準備して、Tableauで参照したい場合は
たいていのデータベースにある「一時テーブル機能」を使うと便利です。

使い方は読み込むデータベースに依存します。
今回はSqlServerバージョンを紹介いたします。

初期SQL画面で下のように記述するだけです。

一時テーブルには # をつけます。
複数定義する場合は、; で区切ります。

 

一時テーブルを参照するためには、カスタムSQLを使います。
データソースタブで「新しいカスタムSQL」を選択します。

ここでも、# をつけてアクセスします。

 

こんな感じになります。

 

次はTableauで動的にテーブルを読み込んでみよう!

例えば
テーブル名に年月がついていて、
・現在の年月のテーブルにアクセスしたい
・最終年月のテーブルにアクセスしたい
ってときは初期SQLに動的SQLを使いましょう。

たいていのデータベースは、データにアクセスするための言語を持っています。
SqlServerはT-SQL (Transact-SQL)という言語です。

これを使って、
名前が「DateDataYYYYMM」のテーブルが複数あるときに
最終年月のテーブルをデータソースとするロジックを紹介いたします。

SqlServerのSQLは大文字で書くのが多いような気がするので、大文字にしましたが
小文字でも大丈夫です。大文字だと疲れちゃうよね(笑)

初期SQLに以下を記入します。

DECLARE @SQL NVARCHAR(MAX);
DECLARE @PARA NVARCHAR(MAX);
DECLARE @TAB_NAME VARCHAR(100);

SET @SQL = N'SELECT @TAB_NAME = MAX(RIGHT(NAME, 6)) FROM sys.objects WHERE LEFT(NAME,8) = ''DateData''';
SET @PARA = N'@TAB_NAME VARCHAR(100) OUTPUT';
EXECUTE SP_EXECUTESQL @SQL, @PARA, @TAB_NAME OUTPUT;

--★【これをいれないとカスタムSQLが作れるようにならないんだよ~!】★-------
PRINT @TAB_NAME;

--★【動的SQLのときは##(グローバル)だよ~!】★-------
SET @SQL = N'SELECT ID, NAME INTO ##tmp FROM ' + @TAB_NAME;

EXEC (@SQL);

注意点は、★で書いているところです。

PRINT文を入れないと、データソースの画面でカスタムSQLが作成できないんです。
一時テーブルはグローバル(## ふたつ付ける)でないとエラーになります。
カスタムSQLでアクセスするときも、##tmp でアクセスします。

理由はわからず、やってみたらこうだった、という次第で申し訳ありません。
ちゃんとした理由がわかる方はご連絡をいただけると嬉しいです~!お待ちしています!

いかがでしたでしょうか?
TableauはViewの部分が素晴らしいといつも感心しています。
ロジック部分もPrepを使ったりして柔軟にできますが、データソースがデータベースならSQL言語が便利です。

【メンバー募集中】

truestarでは、新しい仲間を募集しています。詳細は以下をご覧ください。
株式会社truestar採用サイト https://en-gage.net/truestar/