こんにちは。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採用サイト https://en-gage.net/truestar/