http://expert.csdn.net/Expert/topic/1775/1775494.xml?temp=.8407404你去看看
select 收费员,
sum(case 交费方式 when 现金 then 金额 else 0 end ) as 现金,
sum(case 交费方式 when 顶帐 then 金额 else 0 end ) as 顶帐,
sum(case 交费方式 when 协议 then 金额 else 0 end ) as 协议,
现金+顶帐+协议 as 本月合计
from (select distinct 交费方式 from tablea )
group by 收费员
select 收费员,
sum(case 交费方式 when 现金 then 金额 else 0 end ) as 现金,
sum(case 交费方式 when 顶帐 then 金额 else 0 end ) as 顶帐,
sum(case 交费方式 when 协议 then 金额 else 0 end ) as 协议,
现金+顶帐+协议 as 本月合计
from (select distinct 交费方式 from tablea )
group by 收费员
sum(case 交费方式 when 现金 then 金额 else 0 end ) as 现金,
sum(case 交费方式 when 顶帐 then 金额 else 0 end ) as 顶帐,
sum(case 交费方式 when 协议 then 金额 else 0 end ) as 协议,
现金+顶帐+协议 as 本月合计
from (select distinct 交费方式 from tablea )
where 月份='某月'
group by 收费员
declare @sql varchar(8000)
set @sql='select 收费员 '
select @sql=@sql+',isnull(sum(case 交费方式 when '''+a.交费方式+''' then 金额 end ),0) as '+a.交费方式
from (select distinct 交费方式 from 源表) as aselect @sql=@sql+' from 源表 group by 收费员'
print @sqlexec(@sql)
declare @sql varchar(8000)
set @sql='select 收费员 '
select @sql=@sql+',isnull(sum(case 交费方式 when '''+a.交费方式+''' then 金额 end ),0) as '+a.交费方式
from (select distinct 交费方式 from 源表) as a
select @sql=@sql+' into ##temp from 源表 where 月份<8 group by 收费员 '
print @sql
exec(@sql)select *,顶帐+现金+协议 as 八月分之前的合计 from ##temp
set @sql= ''
select @sql=@sql+',isnull(sum(case 交费方式 when '''+交费方式+''' then 金额 else 0 end ),0) as '+交费方式
from (select distinct 交费方式 from 源表 where 月份 = 8 ) as aaaselect @sql='select a.收费员,sum(交费方式) as 本月合计,全年合计,' +@sql+'
from 源表 a ,(select 收费员,sum(交费方式) as 全年合计 from 源表 group by 收费员) b where a.收费员=b.收费员 and 月份=8 group by a.收费员 '
print @sqlexec(@sql)
set @sql= ''
select @sql=@sql+',isnull(sum(case 交费方式 when '''+交费方式+''' then 金额 else 0 end ),0) as '+交费方式
from (select distinct 交费方式 from 源表 where 月份 = 8 ) as aaaselect @sql='select a.收费员,sum(交费方式) as 本月合计,全年合计 ' +@sql+'
from 源表 a ,(select 收费员,sum(交费方式) as 全年合计 from 源表 group by 收费员) b where a.收费员=b.收费员 and 月份=8 group by a.收费员 '
print @sqlexec(@sql)
USE pubs
go
CREATE TABLE abc
( 收费员 varchar(8),
交费方式 varchar(6),
金额 int,
月份 int
)
go
insert into abc values ('张三','现金',200,2)
insert into abc values ('李四','协议',100,2)
insert into abc values ('王五','顶帐',300,4)
insert into abc values ('李四','现金',400,1)
insert into abc values ('王五','现金',200,12)
insert into abc values ('张三','现金',100,1)
insert into abc values ('李四','协议',500,3)
go
into #temp
from (select distinct 收费员 from abc) a left join
(select 收费员,
sum(case 交费方式 when '现金' then 金额 else 0 end ) +
sum(case 交费方式 when '顶帐' then 金额 else 0 end )+
sum(case 交费方式 when '协议' then 金额 else 0 end ) as 全年合计
from abc
group by 收费员) b on a.收费员=b.收费员
left join
(select 收费员,
sum(case 交费方式 when '现金' then 金额 else 0 end ) as 现金,
sum(case 交费方式 when '顶帐' then 金额 else 0 end ) as 顶帐,
sum(case 交费方式 when '协议' then 金额 else 0 end ) as 协议--,
from abc
where 月份=2
group by 收费员) c
on b.收费员=c.收费员
select * from #temp
union
select '总计',sum(现金),sum(顶帐),sum(协议),sum(本月合计),sum(全年合计) from #temp
drop table #temp
这是只要在 "全年合计 from abc "后面加上 where 月份<=8即可