기술 자료

일반 테이블 식 사용


게시 날짜: 20 Dec 2016
마지막 수정 날짜: 20 Jul 2023

질문

Tableau에서 CTE(일반 테이블 식)를 사용하는 방법
 

환경

  • Tableau Desktop
  • SQL Server
  • Teradata
  • IBM DB2

답변

  1. 데이터 > 새 데이터 원본을 선택하고 원하는 데이터 원본을 선택합니다.
  2. 서버 연결 대화 상자에서 초기 SQL을 선택합니다.
  3. 초기 SQL 필드에 CTE를 입력합니다.
    아래 예에서는 'Employees' 테이블에 반복적인 셀프 조인을 사용하여 OrganizationChart라는 이름의 일반 테이블 식을 사용한 직원 보고 계층을 작성합니다. 구문은 데이터 원본에 따라 다소 달라집니다. 

    SQL Server의 경우 SELECT를 쿼리 끝에 사용하지 않고 SELECT INTO [Temp Table Name]을 사용하여 로컬 임시 테이블을 만듭니다. 
    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
    in IBM DB2: 
    SELECT * FROM SESSION.ctedemo
     
Employees 테이블은 다음과 같습니다.

ID

Name

ManagerID

1

John

NULL

2

Jim

1

3

Jane

1

4

Tom

3

5

Bob

4

6

Rob

3

7

Mike

1

위의 해결책은 다음과 같은 결과를 반환합니다. 

ID

Name

Level

ManagerID

1

John

0(Impala Thrift API 오류: SSL_CTX_load_verify_locations: 오류 코드: 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 compatibility with SQL Server (v. 10.0)((SQL Server(10.0 버전)와의 CTE 호환성)
이 문서로 문제가 해결되었습니까?