You can do this using PIVOT, or Static PIVOT, where you hard-code the years, or Dynamic PIVOT, where you create a list of years when you run the query:
Static PIVOT:
create table table1
(
totalhours decimal(10, 2),
year int
)
insert into table1 values(100, 2012)
insert into table1 values(200, 2012)
insert into table1 values(300, 2012)
insert into table1 values(75, 2011)
insert into table1 values(150, 2011)
insert into table1 values(50, 2010)
insert into table1 values(125, 2010)
select *
from
(
select *
from table1
) x
pivot
(
sum(totalhours)
for year in ([2012], [2011], [2010])
) p
Here is an SQL script with an example
Dynamic rotation:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.year)
FROM table1 c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select totalhours, year
from table1
) x
pivot
(
sum(totalhours)
for year in (' + @cols + ')
) p '
execute(@query)
Both will get the same results.