if not object_id('tb') is null
drop table tb
Go
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
Go
declare @s varchar(8000)
select @s=ISNULL(@s,'select isnull(姓名,''合计'') 姓名')
+',sum(case 课程 when '''+课程+''' then 分数 else 0 end)['+课程+']'
from tb group by 课程
select @s=@s+',总分=sum(分数),百分率=ltrim(cast(sum(分数)*100./(select sum(分数) from tb) as dec(9,2)))+''%''
from tb group by 姓名 with rollup'
exec(@s)
/*
姓名 数学 物理 语文 总分 百分率
---------- ----------- ----------- ----------- ----------- ------------------------------------------
李四 84 94 74 252 50.20%
张三 83 93 74 250 49.80%
合计 167 187 148 502 100.00%
(3 行受影响)
*/