KNOWLEDGE BASE

Verwenden allgemeiner Tabellenausdrücke


Veröffentlicht: 20 Dec 2016
Zuletzt geändert am: 20 Jul 2023

Frage

So verwenden Sie allgemeine Tabellenausdrücke (Common Table Expressions, CTEs) in Tableau.
 

Umgebung

  • Tableau Desktop
  • SQL Server
  • Teradata
  • IBM DB2

Antwort

  1. Wählen Sie Daten > Neue Datenquelle und dann die gewünschte Datenquelle aus.
  2. Wählen Sie im Dialogfeld „Serververbindung“ die Option SQL-Anfangsdaten aus.
  3. Geben Sie im Feld „SQL-Anfangsdaten“ Ihren allgemeinen Tabellenausdruck ein.
    Im nachfolgenden Beispiel wird eine rekursive Selbstverknüpfung für die Tabelle 'Employees' verwendet, um eine Mitarbeiterberichtshierarchie mithilfe eines allgemeinen Tabellenausdrucks mit dem Namen 'OrganizationChart' zu erstellen. Die Syntax kann sich je nach Datenquelle etwas unterscheiden. 

    Für den SQL Server wird anstelle von SELECT am Ende der Abfrage eine lokale temporäre Tabelle mithilfe von SELECT INTO [Temp Table Name] erstellt: 
    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


    Für Teradata wird eine temporäre Tabelle mithilfe von CREATE VOLATILE TABLE [Temp Table Name] erstellt: 
    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


    Für 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. Erstellen Sie eine benutzerdefinierte SQL-Abfrage, die eine Auswahl aus der temporären Tabelle vornimmt, in die Sie die Datensätze eingefügt haben. 
    Zum Beispiel in SQL Server: 
    SELECT * from #ctedemo
    In Teradata: 
    SELECT * from ctedemo
    In IBM DB2: 
    SELECT * FROM SESSION.ctedemo
     
Mit einer Mitarbeitertabelle wie der folgenden:

ID

Name

ManagerID

1

John

NULL

2

Jim

1

3

Jane

1

4

Tom

3

5

Bob

4

6

Rob

3

7

Mike

1

Die obige Lösung würde ein Ergebnis wie dieses zurückgeben: 

ID

Name

Level

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

Zusätzliche Informationen

Wenn Tableau eine Datenquelle abfragt, wird benutzerdefinierter SQL-Code in einer Abfrage wie folgt übergeben:

SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL]
SQL Server und Teradata unterstützen die Verwendung allgemeiner Tabellenausdrücke in einer Teilabfrage nicht. Daher ist das Ergebnis ein Fehler.
SQL-Anfangsdaten werden nicht in einer Teilabfrage weitergegeben und können so für CTE verwendet werden.

Wenn Sie die Einbettung dieser Funktion bei zukünftigen Produktversionen unterstützen möchten, stimmen Sie in der folgenden Community-Idee dafür:
CTE-Kompatibilität mit SQL-Server (v. 10.0)
Hat dieser Artikel das Problem gelöst?