BASE DE DADOS DE CONHECIMENTO

Usar expressões de tabela comuns


Publicado: 20 Dec 2016
Data da última modificação: 20 Jul 2023

Pergunta

Como usar expressões de tabela comuns (CTEs) no Tableau.
 

Ambiente

  • Tableau Desktop
  • SQL Server
  • Teradata
  • IBM DB2

Resposta

  1. Selecione Dados > Nova fonte de dados e escolha a fonte de dados desejada.
  2. Na caixa de diálogo Conexão de servidor, escolha SQL inicial.
  3. Insira o CTE no campo SQL incial.
    O exemplo abaixo usa uma autoassociação recursiva na tabela "Funcionários" para criar uma hierarquia de relatório de funcionário usando uma expressão de tabela comum chamada OrganizationChart. A sintaxe difere um pouco dependendo da fonte de dados. 

    Para o SQL Server, criamos uma tabela local temporária usando SELECT INTO [Temp Table Name] em vez de SELECT no fim da consulta: 
    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


    Para o Teradata, criamos uma tabela temporária usando 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


    Para 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. Crie uma consulta de SQL personalizado que seleciona a partir da tabela temporária inserida nos registros. 
    Por exemplo, no SQL Server: 
    SELECT * from #ctedemo
    No Teradata: 
    SELECT * from ctedemo
    No IBM DB2: 
    SELECT * FROM SESSION.ctedemo
     
Com uma tabela de funcionários como a seguinte:

ID

Nome

ManagerID

1

John

NULO

2

Jim

1

3

Jane

1

4

Tom

3

5

Bob

4

6

Rob

3

7

Mike

1

A solução acima retornaria um resultado como o seguinte: 

ID

Nome

Nível

ManagerID

1

John

0

NULO

2

Jim

1

1

3

Jane

1

1

7

Mike

1

1

4

Tom

2

3

6

Rob

2

3

5

Bob

3

4

Informações adicionais

Quando o Tableau consulta uma fonte de dados, o SQL personalizado é transferido em uma consulta como a seguinte:

SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL]
O SQL Server e Teradata não suportam o uso do CTE em uma subconsulta, então resulta em erro.
O SQL inicial não é transmitido em uma subconsulta, portanto pode ser usado para uma CTE.

Para dar voz a seu suporte à inclusão deste recurso em uma versão futura do produto, adicione seu voto na seguinte Community Idea:
Compatibilidade CTE com o SQL Server (v. 10.0)
Este artigo resolveu o problema?