zgdy 发表于 2018-10-18 07:14:38

sql server 交叉表查询实例-成绩统计

  首先我们建立如下的表:
  sc(成绩表)
  stuid clsid                                              scroe
  ----- -------- -----------------------------------------------------
  01011                                                75.0
  01021                                                70.0
  01031                                                90.0
  01012                                                89.0
  01022                                                80.0
  01032                                                99.0
  01013                                                89.0
  01023                                                79.0
  01033                                                67.0
  其中stuid表示学生编号,clsid表示课程编号,scroe表示成绩
  stu(学生表)
  stuid       stuname
  ----------- --------------------------------------------------
  101         张三
  102         李四
  103         王五
  cls(课程表)
  clsid       name
  ----------- --------------------------------------------------
  1         语文
  2         数学
  3         英语
  接下来就是关键了,其实也不算好复杂,就是用到了动态sql
  declare @sql nvarchar(4000),@sql1 nvarchar(4000)
  select @sql='',@sql1=''
  select @sql=@sql+',['+name+']=sum(case clsid when '''+clsid+''' then scroe else 0 end)',
  @sql1=@sql1+',['+name+'名次]=(select sum(1) from # where ['+name+']>=a.['+name+'])'
  from(select distinct b.clsid,c.name from sc as b inner join cls as c on c.clsid=b.clsid) as a order by clsid
  exec('select stuid 学号'+@sql+',总成绩=sum(scroe)
  ,平均分=Convert(dec(5,1),avg(scroe)),总名次=(select sum(1) from(select stuid,aa=sum(scroe) from sc group by stuid) aa where sum(a.scroe)
页: [1]
查看完整版本: sql server 交叉表查询实例-成绩统计