知識庫

使用通用資料表運算式


發佈時間 : 20 Dec 2016
上次修改日期 : 20 Jul 2023

問題

如何在 Tableau 中使用通用表運算式 (CTE)。
 

環境

  • Tableau Desktop
  • SQL Server
  • Teradata
  • IBM DB2

答案

  1. 選擇資料 > 新建資料來源,並選擇所需的資料來源。
  2. 在「伺服器連接」對話方塊中,按一下初始 SQL
  3. 在「初始 SQL」欄位中輸入您的 CTE。
    以下的範例使用「員工」表上的遞歸自加入用名為 OrganizationChart 的通用表運算式構建員工報告階層。語法根據資料來源略有不同。 

    對於 SQL Server,我們在查詢結尾使用「SELECT INTO [Temp Table Name]」而非「SELECT」,建立本機暫存表: 
    WITH OrganizationChart (Id, [Name],  [Level], ManagerID) AS (
    SELECT
    Id, [Name], 0 as [Level], ManagerID
    FROM
    [dbo].[Employees] emp
    WHERE
    ManagerID IS NULL
    UNION ALL
    SELECT
    emp.ID, emp.[Name], [Level] + 1, emp.ManagerID
    FROM [dbo].[Employees] emp
    INNER JOIN OrganizationChart d ON
    emp.ManagerID = d.Id
    )
    SELECT  [Id], [Name], [Level], [ManagerID] INTO #ctedemo from OrganizationChart


    對於 Teradata,我們使用 CREATE VOLATILE TABLE [Temp Table Name] 建立一個暫存表: 
    CREATE VOLATILE TABLE ctedemo AS (WITH RECURSIVE OrganizationChart (Id, Name,  Level, ManagerID) AS (
    SELECT
    Id, Name, 0 as Level, ManagerID
    FROM
    TEST.Employees emp
    WHERE
    ManagerID IS NULL
    UNION ALL
    SELECT
    emp.ID, emp.Name, Level + 1, emp.ManagerID
    FROM TEST.Employees emp
    INNER JOIN OrganizationChart d ON
    emp.ManagerID = d.Id
    ) SELECT  Id, Name, Level, ManagerID from OrganizationChart) WITH DATA NO PRIMARY INDEX
    ON COMMIT PRESERVE ROWS


    若使用 IBM DB2:
    DECLARE GLOBAL TEMPORARY TABLE SESSION.ctedemo(ID int, Name varchar(50), Level int, ManagerID int) on commit preserve rows with replace not logged;
    INSERT INTO SESSION.ctedemo(ID, Name, Level, ManagerID) WITH OrganizationChart (Id, Name,  Level, ManagerID) AS (
    SELECT
    Id, Name, 0 as Level, ManagerID
    FROM
    Employees emp
    WHERE
    ManagerID IS NULL
    UNION ALL
    SELECT
    emp.ID, emp.Name, Level + 1, emp.ManagerID
    FROM Employees emp, OrganizationChart d
    where
    emp.ManagerID = d.Id
    )
    SELECT  Id, Name, Level, ManagerID from OrganizationChart

     
  4. 建立一個自訂 SQL 查詢以從您將記錄插入的暫存表中選擇。 
    例如,在 SQL Server 中: 
    SELECT * from #ctedemo
    在 Teradata 中: 
    SELECT * from ctedemo
    在 IBM DB2 中: 
    SELECT * FROM SESSION.ctedemo
     
員工表如下所示:

ID

名稱

ManagerID

1

John

NULL

2

Jim

1

3

Jane

1

4

Tom

3

5

Bob

4

6

Rob

3

7

Mike

1

以上解決方案將傳回如下結果: 

ID

名稱

等級

ManagerID

1

John

0

NULL

2

Jim

1

1

3

Jane

1

1

7

Mike

1

1

4

Tom

2

3

6

Rob

2

3

5

Bob

3

4

其他資訊

Tableau 查詢資料來源時,會在如下所示的查詢中傳遞自訂 SQL:

SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL]
SQL Server 和 Teradata 不支援在子查詢中使用 CTE,所以結果是一個錯誤。
初始 SQL 未在子查詢中傳遞,因此可用於 CTE。

為了表達您對在將來的產品版本中包括此功能的支持,請為以下社群理念投下您的一票:
CTE 與 SQL Server 的相容性 (v.10.0)
這篇文章是否解決了問題?