We are all familiar with seeing our data in a vertical format from SSMS. Here is a sample:
SELECT *
FROM #EmployeeJobs
Employee_ID Job_id
100 500
100 501
100 502
100 503
100 504
191 501
191 502
191 503
191 505
188 503
188 504
But what if you, or your customer want’s the data horizontally? That is easy enough with a CTE. Here is a quick sample that creates a temp table with some employees and jobs.
-- Create a sample table
create table #EmployeeJobs
( Employee_ID int
, Job_id int
)
-- Insert some values into the table
insert into #EmployeeJobs( Employee_ID, Job_id ) values
(100,500)
,(100,501)
,(100,502)
,(100,503)
,(100,504)
,(191,501)
,(191,502)
,(191,503)
,(191,505)
,(188,503)
,(188,504)
-- Use a CTE to build a list the employees and their jobs
;with CTE as
(SELECT Employee_ID
, Job_id
, row_number() over (partition by Employee_ID order by Job_id) as Numbers
FROM #EmployeeJobs
)
-- Display all of the user jobs
select EMPLOYEE_ID
, max(case when Numbers = 1 then Job_id else null end) as Job_1
, max(case when Numbers = 2 then Job_id else null end) as Job_2
, max(case when Numbers = 3 then Job_id else null end) as Job_3
, max(case when Numbers = 4 then Job_id else null end) as Job_4
, max(case when Numbers = 5 then Job_id else null end) as Job_5
, max(case when Numbers = 6 then Job_id else null end) as Job_6
from CTE
group by EMPLOYEE_ID
Now, the results will look like this:
EMPLOYEE_ID Job_1 Job_2 Job_3 Job_4 Job_5 Job_6
100 500 501 502 503 504 NULL
188 503 504 NULL NULL NULL NULL
191 501 502 503 505 NULL NULL
This probably isn’t the best way to get results in this fashion, but it is certainly quick and easy. Thanks to the guys at SQLServerCentral.com for this one!