BASE DE CONOCIMIENTO

Usar expresiones de tabla comunes


Publicado: 20 Dec 2016
Fecha de la última modificación: 20 Jul 2023

Pregunta

Descubra cómo utilizar expresiones de tabla comunes (CTE) en Tableau.
 

Entorno

  • Tableau Desktop
  • SQL Server
  • Teradata
  • IBM DB2

Respuesta

  1. Seleccione Datos > Nueva fuente de datos y elija la fuente de datos que desee.
  2. En el cuadro de diálogo Conexión de servidor, seleccione SQL inicial.
  3. Escriba la CTE en el campo SQL inicial.
    En el ejemplo siguiente se utiliza una unión automática recurrente en la tabla "Employees" (Empleados) para crear una jerarquía de generación de informes de empleados mediante una expresión de tabla común denominada OrganizationChart. La sintaxis varía ligeramente en función de la fuente de datos. 

    Para SQL Server, creamos una tabla temporal local mediante SELECT INTO [Nombre de la tabla temporal] en lugar de utilizar SELECT al final de la 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 Teradata, creamos una tabla temporal utilizando CREATE VOLATILE TABLE [Nombre de la tabla temporal]:  
    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. Cree una consulta SQL personalizada que haga una selección de la tabla temporal en la que insertó los registros.  
    Por ejemplo, en SQL Server:  
    SELECT * from #ctedemo
    En Teradata: 
    SELECT * from ctedemo
    En IBM DB2:  
    SELECT * FROM SESSION.ctedemo
     
Con una tabla de empleados como esta:

ID

Nombre

ManagerID

1

John

NULL

2

Jim

1

3

Jane

1

4

Tom

3

5

Bob

4

6

Rob

3

7

Mike

1

La solución anterior mostraría un resultado como este: 

ID

Nombre

Nivel

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

Información adicional

Cuando Tableau consulta una fuente de datos, el SQL personalizado se pasa en una consulta como esta:

SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL]
SQL Server y Teradata no admiten el uso de CTE en una subconsulta, por tanto da como resultado un error.
El SQL inicial no se pasa en una subconsulta, por lo que se puede utilizar para una CTE.

Para darnos su apoyo para incluir esta característica en una próxima versión del producto, añada su voto a la siguiente idea de la comunidad:
Compatibilidad de CTE con SQL Server (v. 10.0)
¿Fue de ayuda este artículo para resolver el problema?