create table tb(id int,date datetime,sale decimal(10,2)) insert into tb select 1,'2008-01-01',10 insert into tb select 2,'2008-01-01',10 insert into tb select 3,'2008-02-01',20 insert into tb select 4,'2008-02-01',20 insert into tb select 5,'2008-03-01',30 insert into tb select 6,'2008-03-01',30 insert into tb select 7,'2008-04-01',40 insert into tb select 8,'2008-04-01',40 insert into tb select 9,'2008-05-01',50 insert into tb select 10,'2008-05-01',50 insert into tb select 11,'2008-06-01',60 insert into tb select 12,'2008-06-01',60 insert into tb select 13,'2008-07-01',70 insert into tb select 14,'2008-07-01',70 insert into tb select 15,'2008-08-01',80 insert into tb select 16,'2008-08-01',80 insert into tb select 17,'2008-09-01',90 insert into tb select 18,'2008-09-01',90 insert into tb select 19,'2008-10-01',100 insert into tb select 20,'2008-10-01',100 insert into tb select 21,'2008-11-01',110 insert into tb select 22,'2008-11-01',110 insert into tb select 23,'2008-12-01',120 insert into tb select 24,'2008-12-01',120--静态查询 select sum(case when datepart(yy,date)='2008' and datepart(mm,date)='01' then sale else 0 end) as '1月', sum(case when datepart(yy,date)='2008' and datepart(mm,date)='02' then sale else 0 end) as '2月', sum(case when datepart(yy,date)='2008' and datepart(mm,date)='03' then sale else 0 end) as '3月', sum(case when datepart(yy,date)='2008' and datepart(mm,date)='04' then sale else 0 end) as '4月',sum(case when datepart(yy,date)='2008' and datepart(mm,date)='05' then sale else 0 end) as '5月', sum(case when datepart(yy,date)='2008' and datepart(mm,date)='06' then sale else 0 end) as '6月', sum(case when datepart(yy,date)='2008' and datepart(mm,date)='07' then sale else 0 end) as '7月', sum(case when datepart(yy,date)='2008' and datepart(mm,date)='08' then sale else 0 end) as '8月',sum(case when datepart(yy,date)='2008' and datepart(mm,date)='09' then sale else 0 end) as '9月', sum(case when datepart(yy,date)='2008' and datepart(mm,date)='10' then sale else 0 end) as '10月', sum(case when datepart(yy,date)='2008' and datepart(mm,date)='11' then sale else 0 end) as '11月', sum(case when datepart(yy,date)='2008' and datepart(mm,date)='12' then sale else 0 end) as '12月' from tb --插入2009年数据 insert into tb select 25,'2009-01-01',10 --动态查询 declare @sql varchar(max) select @sql=isnull(@sql+',','')+'sum(case when datepart(yy,date)='''+ltrim([year])+''' and datepart(mm,date)='''+ltrim([month])+''' then sale else 0 end) as ['+ltrim([year])+'年'+ltrim([month])+'月]' from (select distinct datepart(yy,date) as [year],datepart(mm,date) as [month] from tb)a exec('select '+@sql+' from tb')
insert into tb select 1,'2008-01-01',10
insert into tb select 2,'2008-01-01',10
insert into tb select 3,'2008-02-01',20
insert into tb select 4,'2008-02-01',20
insert into tb select 5,'2008-03-01',30
insert into tb select 6,'2008-03-01',30
insert into tb select 7,'2008-04-01',40
insert into tb select 8,'2008-04-01',40
insert into tb select 9,'2008-05-01',50
insert into tb select 10,'2008-05-01',50
insert into tb select 11,'2008-06-01',60
insert into tb select 12,'2008-06-01',60
insert into tb select 13,'2008-07-01',70
insert into tb select 14,'2008-07-01',70
insert into tb select 15,'2008-08-01',80
insert into tb select 16,'2008-08-01',80
insert into tb select 17,'2008-09-01',90
insert into tb select 18,'2008-09-01',90
insert into tb select 19,'2008-10-01',100
insert into tb select 20,'2008-10-01',100
insert into tb select 21,'2008-11-01',110
insert into tb select 22,'2008-11-01',110
insert into tb select 23,'2008-12-01',120
insert into tb select 24,'2008-12-01',120--静态查询
select
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='01' then sale else 0 end) as '1月',
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='02' then sale else 0 end) as '2月',
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='03' then sale else 0 end) as '3月',
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='04' then sale else 0 end) as '4月',sum(case when datepart(yy,date)='2008' and datepart(mm,date)='05' then sale else 0 end) as '5月',
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='06' then sale else 0 end) as '6月',
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='07' then sale else 0 end) as '7月',
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='08' then sale else 0 end) as '8月',sum(case when datepart(yy,date)='2008' and datepart(mm,date)='09' then sale else 0 end) as '9月',
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='10' then sale else 0 end) as '10月',
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='11' then sale else 0 end) as '11月',
sum(case when datepart(yy,date)='2008' and datepart(mm,date)='12' then sale else 0 end) as '12月'
from tb
--插入2009年数据
insert into tb select 25,'2009-01-01',10
--动态查询
declare @sql varchar(max)
select @sql=isnull(@sql+',','')+'sum(case when datepart(yy,date)='''+ltrim([year])+''' and datepart(mm,date)='''+ltrim([month])+''' then sale else 0 end) as ['+ltrim([year])+'年'+ltrim([month])+'月]'
from (select distinct datepart(yy,date) as [year],datepart(mm,date) as [month] from tb)a
exec('select '+@sql+' from tb')