2016-05-05 20 views
1

TableauにSQLクエリを挿入すると、このエラーメッセージが表示されます。この問題を解決するには?テーブル内のSQLの構文が正しくありません

SQL Serverは現在、CTEをサブクエリ内に配置できませんか?以下は

私は[Microsoft]の[SQL Serverネイティブクライアント11.0] [SQL Serverの] 'WITH' キーワードの近くに不正な構文

にクエリを挿入したときタブロー出力です。

[Microsoft] [SQL Serverネイティブクライアント11.0] [SQL Server]キーワード 'with'の近くに構文が正しくありません。このステートメントが共通テーブル 式、xmlnamespaces句または変更トラッキングコンテキスト 句である場合、前のステートメントはセミコロンで終了する必要があります。

[Microsoft] [SQL Serverネイティブクライアント11.0] [SQL Server] ')'の近くの構文が正しくありません。以下は

私の現在のCTEクエリ(再帰的)

WITH shiftHours AS (
    SELECT RowID, 
    y.EMPLOYEENAME AS EMPLOYEENAME, 
    -- flatten the first hour to remove the minutes and get the initial current hour 
    DATEADD(hour, DATEDIFF(hour, 0, ShiftA_Start), 0) AS currentHour, 
    ShiftA_Start, 
    ShiftA_End, 
    DATEPART(hour, ShiftA_Start) AS hourOrdinal, 
    -- determine how much of the first hour is applicable. if it is minute 0 then the whole hour counts 
    CAST(CASE 
     WHEN DATEADD(hour, DATEDIFF(hour, 0, ShiftA_Start), 0) = DATEADD(hour, DATEDIFF(hour, 0, ShiftA_End), 0) THEN DATEDIFF(minute, ShiftA_Start, ShiftA_End)/60.0 
     WHEN DATEPART(minute, ShiftA_Start) = 0 THEN 1.0 
     ELSE (60 - DATEPART(minute, ShiftA_Start))/60.0 
    END AS DECIMAL(5,3)) AS hourValue 
FROM (
    -- use a ROW_NUMBER() to generate row IDs for the shifts to ensure each row is unique once it gets to the pivot 
    SELECT ROW_NUMBER() OVER(ORDER BY ShiftA_Start, ShiftA_End) AS RowID, 
    EMPLOYEENAME, 
     ShiftA_Start, 
     ShiftA_End 
    FROM (
     -- this is where the data gets pulled from the source table and where the data types are converted from string to DATETIME 
     SELECT 
     EMPLOYEENAME, 
     CONVERT(DATETIME, LEFT(SHIFTA_start, 17), 103) AS ShiftA_Start, 
      CONVERT(DATETIME, LEFT(SHIFTA_end, 17), 103) AS ShiftA_End 
     from [TableName].[dbo].[TMS_People] 
     where 
     CONVERT(DATETIME, LEFT(SHIFTA_START, 17), 103) IS NOT NULL AND CONVERT(DATETIME, LEFT(SHIFTA_END, 17), 103) IS NOT NULL 
     AND CONVERT(DATETIME, LEFT(SHIFTA_START, 17), 103) != CONVERT(DATETIME, LEFT(SHIFTA_END, 17), 103) 


     -- this is also where you would add any filtering from the source table such as date ranges 
    ) x 
) AS y 


UNION ALL 

SELECT RowID, 
EMPLOYEENAME, 
    -- add an hour to the currentHour each time the recursive CTE is called 
    DATEADD(hour, 1, currentHour) AS currentHour, 
    ShiftA_Start, 
    ShiftA_End, 
    DATEPART(hour, DATEADD(hour, 1, currentHour)) AS hourOrdinal, 
    CAST(CASE 
     -- when this is the last time period determine the amount of the hour that is applicable 
     WHEN DATEADD(hour, 2, currentHour) > ShiftA_End THEN DATEPART(minute, ShiftA_End)/60.0 
     ELSE 1 
    END AS DECIMAL(5,3)) AS hourValue 
from shiftHours 

-- contine recursion until the next hour is after the ShiftEnd 
WHERE DATEADD(hour, 1, currentHour) < ShiftA_End 
) 
    SELECT * 
FROM (
    SELECT RowID, 
EMPLOYEENAME, 
    ShiftA_Start, 
    ShiftA_End, 
    hourValue, 
    hourOrdinal 
from shiftHours 

    ) AS t 
    PIVOT (
    SUM(hourValue) 
    FOR hourOrdinal IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23]) 
) AS pvt 
OPTION (MAXRECURSION 0); 
+0

右タグに – e4c5

+1

を使用してくださいビューまたはサブクエリまたはストアドプロシージャ/テーブル値関数を使用して同じロジックを実装する方法クエリ – tharif

答えて

2

タブローは、SQLサーバーCTE機能をサポートしていませんです。

ビューまたはサブクエリまたはストアドプロシージャ/テーブル値関数を使用して同じロジックを実装するようにしてください。

スレッドを投げ捨ててください。CTE(SQL Server)はTableauには載っていません。

https://community.tableau.com/thread/105965

サンプルコードを表示我々は、ユーザーテーブル(userIdを、ユーザ名、マネージャーID)を持っている場合はCTE

ため

CREATE VIEW vUSER AS 
    WITH UserCTE AS (
    SELECT userId, userName, managerId,0 AS steps 
    FROM dbo.Users 
    WHERE userId = null 

    UNION ALL 
     SELECT mgr.userId, mgr.userName, mgr.managerId, usr.steps +1 AS  steps 
    FROM UserCTE AS usr 
    INNER JOIN dbo.Users AS mgr 
    ON usr.managerId = mgr.userId 
    ) 
    SELECT * FROM UserCTE ; 

は、SPすなわちMYPROCを作成し、それに リンクを作成します。2

CREATE procedure dbo.MyProc AS 
    WITH UserCTE AS (
    SELECT userId, userName, managerId,0 AS steps 
    FROM dbo.Users 
    WHERE userId = null 

    UNION ALL 
     SELECT mgr.userId, mgr.userName, mgr.managerId, usr.steps +1 AS  steps 
    FROM UserCTE AS usr 
    INNER JOIN dbo.Users AS mgr 
    ON usr.managerId = mgr.userId 
    ) 
    SELECT * FROM UserCTE ; 

すなわち、すべてのクエリを置きますサーバーはsp_addlinkedserverを使用しています。つまり、私はローカルであることを伝えています

3 openqueryを使用して、spであなたのビューを呼び出します。

 CREATE VIEW dbo.MyView 
     AS(
     SELECT  * 
       FROM openquery(Local,'exec mydb.dbo.MyProc')) 

http://capnjosh.com/blog/how-to-call-a-stored-procedure-from-a-view-in-sql-server/

+0

を投稿? 私は再帰的ですが、私はサブクエリがこの機能をサポートしていないことを理解しています。 – Vannessa

+0

答えにビューサンプルコードを追加しています。 –

+0

ビューに変更するには?上記の質問に私の現在のCTE再帰コードを追加しました。見てください。 – Vannessa

関連する問題