2013-08-03 5 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 таблице

Если у кого есть идея, пожалуйста, помогите мне

Этот текущий запрос показывает ошибку

Subquery вернулись более 1 стоимость. Это недопустимо, когда подзапрос следует =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

Благодаря

ответ

0

Вы близки к идее, но вы должны использовать динамический SQL для динамического поворота таблицы. Ошибка, которую вы имеете, связана с select @Leavetype =(select LeaveName from LeaveType) i.e, только подзапросом может быть возвращено только одно значение для назначения переменной.

Что вам нужно сделать, это примерно то же, что и следующая строка, в которой для построения сводного запроса используется строка значений (столбцов), разделенная запятыми.

-- 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-сервере, но когда я использую этот запрос (после создания хранимой процедуры) при кодировании его отображаемой ошибки ** onversion не удалось при преобразовании значения nvarchar '** – user2516261

+0

вы внесли какие-либо изменения или добавили что-нибудь в вас, re proc? если это так, вам лучше задать другой вопрос с кодом, который вы используете в хранимой процедуре. вы также можете попробовать явно лить 'LeaveName' в' NVARCHAR (n) '. –

Смежные вопросы