Abhi.Net
Abhi.Net

Reputation: 772

SQL CROSS TAB & PIVOT

I am using the following query to retrieve some results

SELECT  CONVERT(varchar, TS.StaffID) + CHAR(13) 
        + SUBSTRING ( TS.GivenName, 1 , 1 ) + '.' + CHAR(13) 
        + TS.Surname AS EmployeeInfo, SH.Hours,ts.UnitID,sh.RowID
         FROM dbo.tbl_TimesheetStaff AS TS
         Left OUTER JOIN
         dbo.tbl_StaffHours AS SH ON
         SH.ActivityUnitID = TS.ActivityUnitID
         AND Sh.StaffID=ts.StaffID
         WHERE TS.UnitID=1

The resulting set looks like

   EmployeeInfo   Hours  UnitID RowID
    114 H. Bar     73.71    111   401
    114 H. Bar     42.44    111   402
    115 M. Cha     20.39    111   401
    115 M. Cha     3.616    111   402
    116 Q. Xyz     20.39    111   401
    116 Q. Xyz     3.61     111   402

Now what I want is to convert the EmployeeInfo column values to column names

   114 H. Bar  115 M. Cha  116 Q. Xyz  RowID
     73.71       20.39       20.39      401
     42.44       3.616       3.61       402

The number of rows in EmployeeInfo can vary and hence I need a dynamic pivot function.

Any clues..?

Upvotes: 2

Views: 708

Answers (1)

Joe G Joseph
Joe G Joseph

Reputation: 24046

try this:

create table #t table(EmployeeInfo varchar(20),  Hours float, UnitID int, RowID int)
insert into #t
SELECT  CONVERT(varchar, TS.StaffID) + CHAR(13)  
        + SUBSTRING ( TS.GivenName, 1 , 1 ) + '.' + CHAR(13)  
        + TS.Surname AS EmployeeInfo, SH.Hours,ts.UnitID,sh.RowID 
         FROM dbo.tbl_TimesheetStaff AS TS 
         Left OUTER JOIN 
         dbo.tbl_StaffHours AS SH ON 
         SH.ActivityUnitID = TS.ActivityUnitID 
         AND Sh.StaffID=ts.StaffID 
         WHERE TS.UnitID=1 



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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(EmployeeInfo)  
                    from #t 
            FOR XML PATH(''), TYPE 
            ).value('.', 'NVARCHAR(MAX)')  
        ,1,1,'') 

set @query = 'SELECT RowID,  ' + @cols + '   
                from #t 
            pivot  
            ( 
                MAX([Hours]) 
                for Code in (' + @cols + ') 
            ) p ' 
print(@query) 
execute(@query) 

Upvotes: 2

Related Questions