вы можете сделать это, используя PIVOT
либо со статическим / динамическим поворотом. Ниже приведен пример статического поворота:
create table #temp
(
[group] varchar(1),
createdate smalldatetime,
qty int
)
insert into #temp values ('A', '3/1/2012', 5)
insert into #temp values ('A', '2/1/2012', 1)
insert into #temp values ('A', '2/1/2012', 3)
insert into #temp values ('B', '2/1/2012', 4)
insert into #temp values ('A', '1/1/2012', 1)
select [group]
, total
, isnull([1/1/2012], 0) as '2012/1'
, isnull([2/1/2012], 0) as '2012/2'
, isnull([3/1/2012], 0) as '2012/3'
from
(
select t1.[group], t1.createdate, t1.qty, t2.total
from #temp t1
left join
(
select [group], sum(qty) as Total
from #temp
group by [group]
) t2
on t1.[group] = t2.[group]
) x
pivot
(
sum(qty)
for createdate in ([3/1/2012], [2/1/2012], [1/1/2012])
) p
order by [group]
drop table #temp
для динамического пивота много ресурсов:
Сводки с динамическими столбцами в SQL Server 2005
Использование SQL Server 2005/2008 Pivot для неизвестного числа столбцов (динамический Pivot)
поиск SO также даст вам много ответов о динамических поворотах.