2016-01-27 48 views
0

我有3個表(1. Emp,2. OnLeave,3.DaysWeeks)。我試圖寫一個樞軸查詢displyas empname,並calenderdates列)SQL數據透視表查詢錯誤:未封閉的引號

當我嘗試運行數據透視查詢時出現跟隨錯誤。

1.在字符串'2016-12-31]))as pvt'後未使用引號。

2.Incorrect附近的語法 '2016年12月31日]))爲列兵'

DECLARE @cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX) 

SELECT @cols = STUFF((SELECT ',' + QUOTENAME([CalDate]) 
        FROM DaysWeeks 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SELECT @query = 
'WITH cte AS (
SELECT EmpDays.Employee,EmpDays.CalDate, ISNULL(v.VacationType,1) AS LeaveStatus 
FROM dbo.OnLeave v 
RIGHT OUTER JOIN 
(SELECT e.EmpID AS Employee, dw.CalDate AS CalDate, dw.DayOfWeekName AS DoWName 
    FROM daysweeks dw, 
     dbo.Emp e 
     WHERE dw.CalYear = 2016 AND dw.monthnumber=1) AS EmpDays 
ON 
    v.EmpID = EmpDays.Employee 
    AND v.StartingDate <= empdays.CalDate 
    AND v.EndingDate >= empdays.CalDate 
) 
SELECT * FROM cte PIVOT 
(Max(cte.LeaveStatus) FOR cte.CalDate in([' + @cols + '])) as pvt' 


EXEC SP_EXECUTESQL @query 
+1

只要試着打印'@ query'的值,看看它是否是正確的語法。你甚至可以手動執行'@ query'的內容來查看你缺少的內容 –

+0

是的,我試圖運行,而不是@cols我通過了一個日期,然後它工作正常。但我的要求是我需要顯示一個月的所有日期= 1需要顯示爲列。 – Programmer2015

+0

嘗試從查詢中刪除[],因爲日期已包含在[日期]中。所以你的進入('+ @cols +')。有關此更多信息,請參閱http://stackoverflow.com/questions/27422109/how-to-pivot-dynamically-with-date-as-column –

回答

1

由於QUOTENAME已經在這裏添加

STUFF((SELECT ',' + QUOTENAME([CalDate]) 

你不需要[]這裏,

FOR cte.CalDate in([' + @cols + '])) as pvt' 

這是錯誤的。這將使整個透視列清單,考慮爲單柱

將其更改爲

FOR cte.CalDate in(' + @cols + ')) as pvt' 

更新:要通過傳遞一個deptId值篩選記錄(如@deptId SMALLINT = 1)。改變你的查詢這樣

Declare @deptId SMALLINT = 1 

...... 
RIGHT OUTER JOIN 
(SELECT e.EmpID AS Employee, dw.CalDate AS CalDate, dw.DayOfWeekName AS DoWName 
    FROM daysweeks dw, 
     dbo.Emp e 
     WHERE dw.CalYear = 2016 
     AND dw.monthnumber=1 
     AND e.deptId = @deptId) AS EmpDays 
...... 

EXEC SP_EXECUTESQL @query,N'@deptId SAMLLINT',@deptId = @deptId 
+0

謝謝@ VR46。它正在工作。但它顯示了從2016年1月1日至2016年12月31日的所有日期。但我需要他們1個月,因爲我在查詢中提到dw.monthnumber = 1。 – Programmer2015

+0

是的,我現在明白了。我從@query中刪除月份數條件,但將其置於列的頂部。現在它工作正常。 SELECT cols = STUFF((SELECT','+ QUOTENAME([CalDate]) FROM DaysWeeks where monthnumber = 1, – Programmer2015

+0

我還有一個問題需要通過傳遞deptId值(@deptId as smallint = 1)來過濾記錄。但是如何實現呢? – Programmer2015