最近学习 sql 2005的新特性,可能很多人都知道了,我反应比较慢,过两天都2010年了,才开始学2005.总结一下: 表如下: create table tb(id varchar(50),cname varchar(50),amount money,actiondate datetime) insert into tb values('001','a',2000.00,'200
最近学习 sql 2005的新特性,可能很多人都知道了,,我反应比较慢,过两天都2010年了,才开始学2005.总结一下:
表如下:
create table tb(id varchar(50),cname varchar(50),amount money,actiondate datetime)
insert into tb values('001','a',2000.00,'2008-02-28')
insert into tb values('001','a',1560.00,'2008-03-28')
insert into tb values('001','a',2040.00,'2008-01-28')
insert into tb values('001','a',1003.00,'2008-04-28')
insert into tb values('101','b',3100.00,'2008-03-28')
insert into tb values('101','b',4040.00,'2008-01-28')
insert into tb values('101','b',5003.00,'2008-04-28')
insert into tb values('101','b',2400.00,'2008-02-28')
insert into tb values('001','a',15000.00,'2007-12-21')
insert into tb values('101','b',22400.00,'2007-12-21')
---------要将数据转换成如下:
id cname 2007-12 2008-01 2008-02 2008-03 2008-04
001 a 15000.00 2040.00 2000.00 1560.00 1003.00
101 b 22400.00 4040.00 2400.00 3100.00 5003.00
实现步骤如下:
-----
select id,cname,sum(amount) as amount,left(convert(varchar(20),actiondate,120),7) as actiondate
into #tmp
from tb
group by id,cname,left(convert(varchar(20),actiondate,120),7)
declare @sql varchar(max), @sqlall nvarchar(max)
select @sql=''
select @sql=@sql+'['+actiondate+'],'
from #tmp group by actiondate
select @sql=left(@sql,len(@sql)-1)
print @sql
select @sqlall='
select * from #tmp s
pivot
(sum(amount)
for actiondate in ('+@sql+')
) as p order by id,cname '
print @sqlall
------step4
exec sp_executesql @sqlall
drop table #tmp
