カスタム SQL クエリへの接続
注: カスタム SQL を使用すると、ワークブックのパフォーマンスに影響を与える可能性があります。DBA と協力することで、最適なカスタム SQL クエリを作成することができます。Tableau Desktop でビューの構築に必要な操作を実行するには、Tableau が WHERE、GROUP BY、およびその他の SQL 句を制御できる必要があります。カスタム SQL クエリにはこのような要素が含まれている可能性があり、Tableau はそれらを既存の SQL に挿入することができないため、Tableau はカスタム SQL ステートメントを select ステートメント内にラップする必要があります。カスタム SQL 接続の実行速度が遅い場合やエラーが発生する場合、Tableau Desktop が実行するカスタム SQL ラッピングが原因であることがよくあります。
ほとんどのデータベースは、データ セット全体ではなく、特定のクエリに接続できます。データベースは互いに少し異なる SQL 構文を持っているため、1 つのデータベースへの接続に使用するカスタム SQL は別のデータベースへの接続に使用する SQL とは異なる場合があります。ただし、カスタム SQL の使用は、必要な情報がわかっていて SQL クエリの作成方法を理解している場合に便利です。
カスタム SQL を使用する一般的な理由はいくつかありますが、カスタム SQL を使用すると、表全体でデータのユニオンを作成、フィールドを再キャストしてクロスデータベース結合を実行、分析用のデータのサイズを再構築または削減などを行うことができます。
Excel およびテキスト ファイル データ ソースの場合、このオプションは Tableau Desktop 8.2 以前に作成された、または従来の接続で Windows 上の Tableau Desktop を使用しているワークブックでのみ使用できます。レガシー接続を使用して Excel またはテキスト ファイルに接続するには、ファイルに接続してから、[開く] ダイアログ ボックスの [開く] ドロップダウン メニューをクリックし、[レガシー接続を開く] を選択します。
注:Tableau 2020.2 以降、従来の Excel 接続とテキスト接続はサポートされなくなりました。レガシー接続の使用に代わる方法については、Tableau コミュニティの「Legacy Connection Alternatives」ドキュメントを参照してください。
カスタム SQL クエリへの接続
データに接続した後、[データ ソース] ページの [新しいカスタム SQL] オプションをダブルクリックします。
テキスト ボックスにクエリを入力するか、貼り付けます。クエリは単一の SELECT* ステートメントである必要があります。
終了したら、[OK] をクリックします。
[OK] をクリックすると、クエリが実行され、カスタム SQL クエリ テーブルがキャンバスの論理レイヤーに表示されます。カスタム SQL クエリ内の関連するフィールドのみが [データ ソース] ページのデータ グリッドに表示されます。
キャンバスの論理レイヤーと物理レイヤーの詳細については、Tableau データ モデルを参照してください。
カスタム SQL クエリの例
表を縦方向に組み合わせる (ユニオン)
データを互いに追加する必要がある場合は、Tableau でキャンバスの物理レイヤーにあるユニオン オプションを使用できます。お使いのデータベースがこのオプションをサポートしていない場合は、代わりにカスタム SQL を使用できます。
たとえば、次のように、11 月と 12 月という、2 つの表があるとします。
11 月 | 12 月 |
---|---|
次のカスタム SQL クエリを使用して、2 番目の表「12 月」を最初の表「11 月」に追加できます。
SELECT * FROM November UNION ALL SELECT * FROM December
データ グリッドでは、クエリの結果は次のようになります。
ユニオン オプションの詳細については、データのユニオンを参照してください。
フィールドのデータ型を変更してクロスデータベース結合を実行する
キャンバスの物理レイヤーにある 2 つのテーブルの間で結合を実行する場合は、結合するフィールドのデータ型が同じである必要があります。フィールドのデータ型が同じでない場合、結合を実行する前に、カスタム SQL を使用してデータ型フィールドを変更 (キャスト) することができます。
たとえば、それぞれが "ルート" フィールドと "ID" フィールドを使用している、"メイン" と "サブ" の 2 つの表を結合するとします。"ルート" フィールドは数字タイプ、"ID" フィールドは文字列タイプです。次のカスタム SQL クエリを使用してルートのデータ型を数字から文字列に変更し、ルート フィールドと ID フィールドを使用して "メイン" 表と "サブ" 表を結合できます。
SELECT
[Main].[Root] AS [Root_Number]
CAST([Main].[Root] AS INT] AS [Root_String]
FROM [Main]
このクエリの結果は、元のルート フィールドと、ルート フィールド キャストを文字列として表示します。
結合とクロスデータベース結合の詳細については、データの結合を参照してください。
データのサイズを小さくする
大きなデータ セットで作業を行う際は、最初にサイズを小さくした場合、データでの作業時間を節約できる場合があります。
たとえば、"FischerIris" という大きい表があるとします。次のカスタム SQL クエリを使用して指定した列やレコードを取得し、Tableau から接続するデータ セットのサイズを減らすことができます。
SELECT
[FischerIris].[Species] AS [Species],
[FischerIris].[Width] AS [Petal Width],
COUNT([FischerIris].[ID]) AS [Num of Species]
FROM [FischerIris]
WHERE [FischerIris].[Organ] = 'Petal'
AND [FischerIris].[Width] > 15.0000
GROUP BY [FischerIris].[Species], [FischerIris].[Width]
データの再構築 (ピボット)
場合によっては、分析前に再構築が必要な表で作業することもあります。このタイプのタスクはピボットなどのオプションを使用して Tableau のキャンバス内にある物理レイヤーで実行できますが、データベースがオプションに対応していない場合があります。この場合、代わりにカスタム SQL を使用できます。
たとえば、次の表があるとします。
Tableau での分析用に構造を変更し、データを最適化するには、次のカスタム SQL クエリを使用できます。
SELECT Table1.Season ID AS [Season ID],
Table1.Items - Don't like AS [Quantity],
"Don't Like" AS [Reason]
FROM Table1
UNION ALL
SELECT Table1.Season ID AS [Season ID],
Table.Items - Defective AS [Quantity],
"Defective" AS [Reason]
FROM Table1
UNION ALL
SELECT Table1.Season ID AS [Season ID],
Table1.Items - Too big AS [Quantity],
"Too Big" AS [Reason]
FROM Table1
UNION ALL
SELECT Table1.Season ID AS Season ID,
Table1.Items - Too small AS [Quantity]
"Too Small" AS [Reason]
FROM Table1
データ グリッドでは、クエリの結果は次のようになります。
ピボット オプションの詳細については、ピボット データ ([列] から [行])を参照してください。
データを組み合わせて (結合) 集計する
テーブルを組み合わせて、データを集計する必要がある場合は、結合と既定の集計タイプ オプションの両方を Tableau のキャンバス内にある物理レイヤーで使用できます。代わりにカスタム SQL を使用する必要が生じることもあります。
たとえば、次のように、"注文" と "ベンダー" という、2 つの表があるとします。
注文 | ベンダー |
---|---|
次のカスタム SQL クエリを使用して、注文数のカウントを見つけ、"注文" および "ベンダー" 表で左結合を実行できます。
SELECT Vendors.Name,COUNT(Orders.Order) AS Number Of Orders
FROM Orders
LEFT JOIN Vendors
ON Orders.VendorID=Vendors.VendorID
GROUP BY Name;
クエリの結果は次のようになります。
結合の詳細については、データの結合を参照してください。
重複列が参照されている場合のエラー
カスタム SQL クエリが重複列を参照している場合、Tableau の分析でいずれかの列を使用しようとするとエラーが発生することがあります。これはクエリが有効な場合でも発生します。たとえば、次のクエリを見てみましょう。
SELECT * FROM
authors, titleauthor WHERE authors.au_id = titleauthor.au_id
クエリは有効ですが、このケースでは au_id フィールドが「authors」表と「titleauthor」表の両方に存在するため、あいまいになっています。Tableau はクエリに接続しますが、au_id フィールドを使用しようとするたびにエラーが発生します。これは、どの表を参照すべきかが Tableau に不明なためです。
注: カスタム SQL クエリでは、可能な場合には AS 句を含む列の別名を定義するのがベスト プラクティスです。各データベースでは、列名の自動生成に関し、別名を使用しない場合に常に使用する独自ルールが設定されているためです。
カスタム SQL クエリの編集
カスタム SQL クエリを編集するには
- キャンバスの [データ ソース] ページで、論理レイヤーのカスタム SQL クエリをダブルクリックします。
- 矢印が表示されるまで、物理レイヤーのカスタム SQL テーブルにカーソルを合わせます。
- 矢印をクリックし、[カスタム SQL クエリの編集] を選択します。
- ダイアログ ボックスで、カスタム SQL クエリを編集します。
カスタム SQL クエリ名を変更するには
カスタム SQL クエリをキャンバスの論理レイヤーにドラッグすると、既定である Custom SQL Query、Custom SQL Query1 などの名前が付けられます。既定の名前は意味を持つ名前に変更できます。
- [データ ソース] ページのキャンバス内にある論理レイヤーで、カスタム SQL クエリ テーブルのドロップダウン矢印を選択し、[名前の変更] を選択します。
- カスタム SQL クエリに使用する名前を入力します。
カスタム SQL クエリでパラメーターを使用する
SQL クエリ ステートメントでパラメーターを使用すると、定数値を動的な値に置換できます。置換後にワークブック内でパラメーターを更新して接続を変更します。たとえば、pageID で指定されている特定のページの Web トラフィック データを得るためのカスタム SQL クエリに接続します。SQL クエリ内で pageID に定数値を使用する代わりに、パラメーターを挿入できます。挿入後に接続を終了すると、ワークブック内でパラメーター コントロールを表示できます。パラメーター コントロールを使用すると、接続の編集または複製を行わずに pageID をオフにして関心のあるページごとにデータを入手できます。
Tableau Desktop では、Custom SQL ダイアログ ボックスから直接パラメーターを作成することも、ワークブックにあるパラメーターを使用することもできます。新しいパラメーターを作成すると、それらのパラメーターは、それ以外のパラメーターと同様にワークブックで使用できるようになります。詳細については、パラメーターの作成を参照してください。
Web 作成 (Tableau Cloud または Tableau Server) の場合は、Tableau Desktop からパブリッシュされた既存のパラメーターを使用できます。Web 作成時に新しいパラメーターを作成することはできません。
パラメーターをカスタム SQL クエリに追加するには
- [データ ソース] ページで、編集アイコンが表示されるまで表をポイントし、編集ボタンをクリックします。
- ダイアログ ボックスの一番下で、[パラメーターの挿入] をクリックします。
- SQL ステートメントで定数値を選択し、[パラメーターの挿入] ドロップダウン メニューから代わりに使用するパラメーターを選択します。まだパラメーターを作成していない場合、[新しいパラメーターの作成] を選択します。新しいパラメーターを作成するには、パラメーターの作成の手順を行います。
注:パラメーターは、リテラル値のみを置換できます。パラメーターは、式または表名などの識別子を置換することはできません。
下の例では、カスタム SQL クエリは優先度に "Urgent (緊急)" のマークが表示されているすべての注文を返します。カスタム SQL ステートメントでは、順序の優先順位は一定の値です。接続を "High (高)" の優先度の注文を表示するように変更するには、そのデータ ソースを編集する必要があります。
同じクエリの多数の変形を作成し維持する代わりに、定数の注文の優先度をパラメーターで置換します。このパラメーターは、[注文の優先度] がとり得るすべての値を含んでいる必要があります。
パラメーターを作成したら、定数値を置換するための SQL ステートメントに挿入できます。
接続の編集が終わったら、新しいパラメーターは [データ] ペインの下部にある [パラメーター] エリアのリストに表示され、パラメーター コントロールがそのビューの右側に表示されます。異なる値を選択すると、接続が更新されます。
注:抽出を使用している場合、パラメーターに加えられた変更内容を反映するために抽出を更新する必要があります。カスタム SQL パラメーターを使用したデータ ソースをパブリッシュすると、そのパラメーターが含まれます。パラメーターは、そのデータ ソースに接続する任意のワークブックに転送されます。
Tableau Catalog のカスタム SQL に関するサポート
Tableau Catalog でのカスタム SQL のサポートは、カスタム SQL クエリに依存します。
Tableau Catalog は、Tableau Server と Tableau Cloud に対する データ管理 の一部として使用できます。Tableau Catalog の詳細については、Tableau Server または Tableau Cloud ヘルプの「Tableau Catalog について」を参照してください。
サポートされているクエリ
Catalog は、ANSI SQL-2003 規格を満たすカスタム SQL クエリをサポートしていますが、次の 3 つの例外があります。
- タイム ゾーン式
- マルチセット式
- Tableau パラメーター
2021.4 以降、Tableau Catalog は、次の例外を除いて、カスタム SQL での Transact-SQL (T-SQL) ダイアレクトの使用もサポートしています。
- ヒント
- FOR 句
- OPENROWSET、OPENXML、および OPENJSON 関数
- ODBC スカラー関数
- FOR SYSTEM_TIME
- TABLESAMPLE
- MATCH (式)
- CONTAINS 式
- FREETEXT 式
Tableau Cloud 2023 年 10 月および Tableau Server 2023.3 以降、Tableau Catalog では、次の例外を除き、PostgreSQL を使用するカスタム SQL クエリのサポートも提供しています。
- XML 関数
- JSON 関数と演算子
サポートされている機能
Catalog は、MySQL、または PostgreSQL ドライバー (Amazon Aurora for MySQL、Amazon RedShift、Pivotal Greenplum Database、MemSQL、Denodo など) を使用する接続を含むデータ ソース、ワークブック、フローで以下の追加機能をサポートしています。
- MySQL GROUP_CONCAT 関数
- PostgreSQL 配列
- PostgreSQL EXTRACT() 関数
その他のカスタム SQL シナリオや機能が動作する場合もありますが、そのテストやサポートを Tableau が特に行うことはありません。
サポートされている系列
アセットがカスタム SQL を使用している場合、[Show Custom SQL Query (カスタム SQLクエリの表示)] ボタンが付いたメッセージがアセット ページの [系列] タブに表示されます。ボタンをクリックして、接続で使用されているカスタム SQL を確認します。次に、カスタム SQL をクリップボードにコピーする場合は、[コピー] をクリックします。
カスタム SQL のタイプによっては、アップストリーム系列が不完全になる場合があります。これが発生すると、その情報を含むメッセージが表示されます。フィールドの詳細カードには、接続されている列へのリンクが含まれていない場合や、接続されている列がまったく表示されない場合があります。列の詳細カードには、列を使用するフィールドへのリンクが含まれていない場合や、フィールドがまったく表示されない場合があります。
テーブルの系列を調べる場合、Catalog では、カスタム SQL を使用して収集したテーブルのメタデータの系統に含まれる列情報は表示されないことに注意してください。ただし、他のアセットが同じテーブルを使用していて、カスタム SQL を使用していない場合は、Tableau Catalog で、これらの他のアセットで検出された列に関する情報を表示できる場合があります。
次のスクリーンショットでは、factAccountOpportunityByQuarter 表がデータ ソースによって使用されるため、このインデックス化が行われています。ただし、カスタム SQL クエリによって参照されているため、列情報を使用することはできません。
複数のデータ ソース、ワークブック、またはフローがテーブルを使用する場合、カスタム SQL クエリを使用するテーブルのダウンストリーム アセットは列レベルのフィルターを適用すると除外されます。結果として、系列に表示されるダウンストリームの資産の数は、実際に使用される数よりも少なくなります。
系列の使用についての詳細は、Tableau Server(新しいウィンドウでリンクが開く) または Tableau Cloud(新しいウィンドウでリンクが開く) ヘルプの「インパクト分析での系列の使用」を参照してください。