经典的行转列加合计

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 行受影响)
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值