2013-08-03 96 views
2

我有一個查詢如何顯示動態列使用數據透視表

declare @Leavetype varchar (Max)  
select @Leavetype =(select LeaveName from LeaveType)  

SELECT * 
FROM 
(SELECT e.EmpID, 
e.EmpName , 
s.LeaveName, 
case when l.Approval = 'Approved' 
then l.TotalDays 
else 
0 
end AS Total 
    from EmpInfo e 
    full JOIN ViewLeave l ON e.EmpID = l.EmpID 
    LEFT JOIN LeaveType s ON s.LeaveID = l.LeaveID  

Where 
     l.year = '2013'    

GROUP BY s.LeaveName,e.EmpID, e.EmpName ,l.Approval,l.TotalDays 
)ps 
pivot 
(
sum(Total) 
for LeaveName In ([@LeaveType]) 

)as pvt   

我想利用休假式表動態值Leavetype

LeaveType表如下

ID Leave type 
1 SickLeave 
2 Casual Leave 

LeaveType表值可能會有所不同,我必須顯示數據,如

EmpId EmpName SickLeave  Casual Leave 

101  ramesh  1    0 

沒有列取決於Leavetype表中沒有行的

如果任何人有一個想法,請大家幫我

該電流查詢顯示錯誤

子查詢返回多個1值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

感謝

回答

0

你是接近的想法,但你必須使用動態SQL動態轉動的表。你有錯誤是因爲select @Leavetype =(select LeaveName from LeaveType),即只有一個值可以被子查詢返回,以便分配給變量。

您需要做的事情大致如下,其中使用逗號分隔的字符串值(列)來構建數據透視查詢。

-- get a comma delimited string of the columns 
DECLARE @leaveType NVARCHAR(1000) 
SELECT @leaveType = STUFF(
         (SELECT DISTINCT TOP 100 PERCENT '],[' + LeaveName 
         FROM LeaveType AS t 
         FOR XML PATH('') 
        ), 1, 2, '' 
        ) + ']' 

-- create the sql script to be executed 
DECLARE @sql NVARCHAR(3000) = N' 
    WITH data AS 
    (
     SELECT 
      e.EmpID, 
      e.EmpName , 
      s.LeaveName, 
      Total = CASE l.Approval 
         WHEN ''Approved'' THEN l.TotalDays 
         ELSE 0 
        END 
     FROM EmpInfo e 
     FULL JOIN ViewLeave l ON e.EmpID = l.EmpID 
     LEFT JOIN LeaveType s ON s.LeaveID = l.LeaveID 
     GROUP BY s.LeaveName, e.EmpID, e.EmpName, l.Approval, l.TotalDays 
    ) 

    SELECT * 
    FROM data 
    PIVOT 
    (
     SUM(Total) 
     FOR LeaveName IN (' + @leaveType + ') 
    ) piv 
' 

PRINT @sql 
EXEC sp_executesql @sql 

Here是一個博客文章在詳細討論PIVOT

+0

謝謝你這麼多它真的很有幫助。 – user2516261

+0

這段代碼在sql server上運行正常,但是當我在編碼它的顯示錯誤時使用這個查詢(在創建存儲過程之後)**轉換nvarchar值'** – user2516261

+0

時發生了顛倒失敗你做了任何修改或添加了任何東西'重新處理?如果是這樣,你最好用你在存儲過程中使用的代碼提出另一個問題。你也可以嘗試顯式地將'LeaveName'轉換爲'NVARCHAR(n)'。 –