KNOWLEDGE BASE

Utilizzo di espressioni di tabella comuni


Pubblicato: 20 Dec 2016
Data dell'ultima modifica: 20 Jul 2023

Domanda

Come utilizzare Espressioni comuni tabella (CTE) in Tableau.
 

Ambiente

  • Tableau Desktop
  • SQL Server
  • Teradata
  • IBM DB2

Risposta

  1. Seleziona Dati > Nuova origine dati e scegli l'origine dati che desideri.
  2. Nella finestra di dialogo Connessione server, scegli SQL iniziale.
  3. Inserisci le tue CTE nel campo SQL iniziale.
    L'esempio che segue utilizza un self join ricorsivo sulla tabella "Dipendenti" per creare una gerarchia di reporting dei dipendenti utilizzando un'espressione di tabella comune chiamata Organigramma. La sintassi varia leggermente a seconda dell'origine dati. 

    Per SQL Server, creiamo una tabella temporanea locale usando SELECT INTO [Nome Tabella Temp] invece che SELECT alla fine della query: 
    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


    Per Teradata, creiamo una tabella temporanea utilizzando CREATE VOLATILE TABLE [Nome Tabella Temp]: 
    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


    Per 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. Crea una query SQL personalizzata che sceglie dalla tabella temporanea in cui hai inserito i record. 
    Ad esempio, in SQL Server:  
    SELECT * from #ctedemo
    in Teradata: 
    SELECT * from ctedemo
    in IBM DB2: 
    SELECT * FROM SESSION.ctedemo
     
Con una tabella dei dipendenti come la seguente:

ID

Nome

ManagerID

1

John

NULL

2

Jim

1

3

Jane

1

4

Tom

3

5

Bob

4

6

Rob

3

7

Mike

1

La soluzione di cui sopra restituirebbe un risultato come questo: 

ID

Nome

Livello

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

Ulteriori informazioni

Quando Tableau esegue una query a un'origine dati, SQL personalizzato viene passato in una query come la seguente:

SELECT TOP 1 * da ( [Tutti i tuoi SQL personalizzati qui] ) come [TableauSQL]
SQL Server e Teradata non supportano l'uso di CTE in una sottoquery, quindi il risultato è un errore.
SQL iniziale non viene passato in una sottoquery, quindi può essere utilizzato per una CTE.

Per esprimere il tuo supporto affinché questa caratteristica venga inclusa in una versione futura del prodotto, vota l'idea proposta nella Community:
Compatibilità CTE con il server SQL (v. 10.0)
Con questo articolo hai risolto il problema?