對於大多數資料庫,您可以連線到特定查詢,而非整個資料集。因為資料庫的 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* 陳述式。
完成後,按一下「確定」。
按一下「確定」時,會執行查詢,而且自訂 SQL 查詢表會出現在畫布的邏輯層中。只有自訂 SQL 查詢的相關欄位才會顯示在「資料來源」頁面的資料網格中。
有關畫布的邏輯和實體層的詳情,請參閱 Tableau 資料模型。
自訂 SQL 查詢的範例
垂直合併表(合併)
如果需要彼此相互附加資料,則可以直接在 Tableau 之畫布的邏輯層中,使用聯集選項。在某些情況下,您的資料庫不支援此選項,因此您可以改用自訂 SQL。
例如,假設您具有以下兩個表:November 和 December。
November | December |
---|---|
![]() | ![]() |
您可以使用以下自訂 SQL 查詢將第二個表 December 附加到第一個表 November:
SELECT * FROM November UNION ALL SELECT * FROM December
查詢結果在資料網格中如下所示:
有關合併選項的詳細資料,請參閱合併資料。
變更欄位的資料類型以執行跨資料庫聯接
要在兩個表之間執行聯結時,您加入的欄位資料類型必須相同。如果欄位的資料類型不相同,則您可以在執行聯接之前使用自訂 SQL 變更資料類型(轉換)欄位。
例如,假設您要分別使用「根」和「ID」欄位聯接「Main」和「Sub」這兩個表。「根」欄位是數位類型,「ID」欄位是字串類型。您可以使用以下自訂 SQL 查詢將「根」的資料類型從數位變更為字串,以便可以使用「根」和「ID」欄位聯接「Main」和「Sub」表。
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。
例如,假設您具有以下兩個表:訂單和供應商。
訂單 | 供應商 |
---|---|
![]() | ![]() |
您可以使用以下自訂 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 查詢拖曳至畫布的邏輯層時,Tableau 會提供預設名稱:Custom SQL Query、Custom SQL Query1 等。您可以將預設名稱變更為更有意義的名稱。
- 在資料來源頁面上,在畫布的邏輯層中,選取自訂 SQL 查詢表中的下拉式箭頭,並選取「重新命名」。
- 輸入您要用於自訂 SQL 查詢的名稱。
在自訂 SQL 查詢中使用參數
您可以在自訂 SQL 查詢語句中使用參數以便將常量值替換為動態值。然後,可以在工作簿中更新參數以修改連線。例如,您可以連線到自訂 SQL 查詢,該查詢為 pageID 所指定的特定頁面提供 Web 流量資料。您可以插入參數,而不是在 SQL 查詢中為 pageID 值使用常量值。完成連線後,可以在工作簿中顯示參數控制項。使用參數控制項可以除去 pageID 並拉入每個所需頁面的資料,而不必編輯或複製連線。
在 Tableau Desktop 里,您可以直接從「自訂 SQL」對話方塊建立參數,也可以使用屬於工作簿的任何參數。如果建立新參數,它將可供在工作簿中使用,就像任何其他參數一樣。若要瞭解更多資訊,請參閱建立參數。
對於 Web 製作(在 Tableau Cloud 或 Tableau Server 上),您可以使用 Tableau Desktop 所發佈的現有參數。您無法在 Web 製作中建立新的參數。
向自訂 SQL 查詢新增參數
- 在「資料來源」頁面上的畫布中,將滑鼠暫留在自訂表上,直至顯示編輯圖示,然後按一下編輯按鈕。
- 在對話方塊底部,按一下「插入參數」。
- 在 SQL 語句中選取常量值,然後從「插入參數」下拉式功能表中選取要使用的參數。如果您尚未建立參數,請選取「建立新參數」。按建立參數中的說明建立參數。
附註: 參數只能替換文字值,不能替換運算式或識別字,例如表名稱。
在以下範例中,自訂 SQL 查詢會返回優先順序標記為「Urgent」的所有訂單。在自訂 SQL 語句中,訂單優先順序是常量值。如果要變更連線以檢視「High」優先順序訂單,必須編輯資料來源。
您可以將訂單優先順序常量值替換為參數,而不是建立並維護同一查詢的許多變體。參數應包含訂單優先順序的所有可能值。
建立參數後,可以將其插入到 SQL 語句以替換常量值。
編輯完連線後,新參數將在「資料」窗格底部的「參數」區域中列出,並且參數控制項將顯示在檢視右側。當您選取不同值時,連線將進行更新。
附註: 如果您正在使用擷取,則必須重新整理擷取才能反映對參數的變更。發佈使用自訂 SQL 參數的資料來源將會包括參數。系統會將參數傳輸至連線到該資料來源的任何工作簿。
Tableau Catalog 對自訂 SQL 的支援
從 2019.3 開始,Tableau Server 和 Tableau Cloud 的 資料管理 供應項目中提供 Tableau Catalog。有關 Tableau Catalog 的詳情,請參閱 Tableau Server 或 Tableau Cloud 說明中的「關於 Tableau Catalog」。
支援的查詢
Catalog 支援符合 ANSI SQL-2003 標準的自訂 SQL 查詢,但有三項例外:
- 時區運算式
- Multiset 運算式
- Tableau 參數
從 2021.4 開始,Tableau Catalog 還支援在自訂 SQL 中使用 Transact-SQL (T-SQL) 方言,但以下情況除外:
- 提示
- FOR 子句
- OPENROWSET、OPENXML 和 OPENJSON 函數
- ODBC 標量函數
- FOR SYSTEM_TIME
- TABLESAMPLE
- MATCH 運算式
- CONTAINS 運算式
- FREETEXT 運算式
支援的功能和函數
Catalog 支援下列額外功能,適用於資料來源、工作簿,以及具有使用 MySQL 或 PostgreSQL 驅動程式之連線的流程,例如 Amazon Aurora for MySQL、Amazon RedShift、Pivotal Greenplum Database、MemSQL、Denodo 和其他驅動程式。
- MySQL GROUP_CONCAT 函數
- PostgreSQL 陣列
- PostgreSQL EXTRACT() 函數
其他自訂 SQL 案例和功能或許也可運作,但 Tableau 並未特別加以測試或支援。
支援的歷程
資產使用自訂 SQL 時,資產頁面的歷程索引標籤上會顯示一條帶有顯示自訂 SQL 查詢按鈕的訊息。按一下該按鈕可查看連線中使用的自訂 SQL。然後,若想將自訂 SQL 複製到剪貼板,請按一下複製。
某些類型的自訂 SQL 會導致上游歷程不完整。發生這種情況時,會出現一條包含該資訊的訊息。欄位詳細資訊卡可能不包含已連線欄的連結,或者可能根本不顯示任何已連線欄。欄詳細資訊卡可能不包含使用該欄的欄位之連結,或者可能根本不顯示任何欄位。
若您正在檢查資料表的歷程,請注意,Catalog 不支援顯示使用自訂 SQL 收集的資料表中繼資料的歷程中的欄資訊。但是,若其他資產使用同一個資料表並且不使用自訂 SQL,則 Tableau Catalog 可能能夠顯示其透過這些其他資產發現的欄的相關資訊。
在下列螢幕擷取畫面中,factAccountOpportunityByQuarter 表格已編製索引,因為它是由資料來源所使用。但由於自訂 SQL 查詢加以參考,因此不會顯示其欄資訊。
在有多個資料來源、工作簿或流程使用某個表格的案例中,任何來自該表格的下游資產若使用了自訂 SQL 查詢,在套用欄層級篩選條件時都將被排除。因此,顯示在歷程中的下游資產會比實際使用的少。
有關使用歷程的詳細資訊,請參閱 Tableau Server(連結在新視窗開啟) 或 Tableau Cloud(連結在新視窗開啟) 說明中的「使用歷程進行影響分析」。