服务器: 消息 156,级别 15,状态 1,行 3
在关键字 'as' 附近有语法错误。declare @sql nvarchar(4000),@sql1 nvarchar(4000)
select @sql='',@sql1=''
select @sql=@sql+',['+name+']=sum(case clsid when'''+clsid+'''then score 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
在关键字 'as' 附近有语法错误。declare @sql nvarchar(4000),@sql1 nvarchar(4000)
select @sql='',@sql1=''
select @sql=@sql+',['+name+']=sum(case clsid when'''+clsid+'''then score 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
1、所有Score都写成了scroe
2、数值型必须转换为字符型declare @sql nvarchar(4000),@sql1 nvarchar(4000)
select @sql='',@sql1='' select @sql=@sql+',['+name+']=sum(case clsid when '''+clsid+ --这里的slsid是数值型的,必须转换为字符型,即clsid--->cast(clsid as varchar(100))
''' 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)<=aa) into # from sc as a group
by stuid select b.stuname as 姓名,a.*'+@sql1+' from # as a inner join stu
as b on a.学号=b.stuid')
--正确的SQL语句:declare @sql nvarchar(4000),@sql1 nvarchar(4000)
select @sql='',@sql1='' select @sql=@sql+',['+name+']=sum(case clsid when '''+ cast(clsid as varchar(100))+''' then score 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(score)
,平均分=Convert(dec(5,1),avg(score)),总名次=(select sum(1) from(select stuid
,aa=sum(score) from sc group by stuid) aa where sum(a.score)<=aa) into # from sc as a group
by stuid select b.stuname as 姓名,a.*'+@sql1+' from # as a inner join stu
as b on a.学号=b.stuid')
又应该怎么做?
--增加平均分数行记录
set nocount on
Create table sc (stuid int,clsid int,score float)
insert sc values(0101,1,75.0)
insert sc values(0102,1,70.0)
insert sc values(0103,1,90.0)
insert sc values(0101,2,89.0)
insert sc values(0102,2,80.0)
insert sc values(0103,2,99.0)
insert sc values(0101,3,89.0)
insert sc values(0102,3,79.0)
insert sc values(0103,1,75.0)
Create table stu (stuid int,stuname varchar(10))
insert stu values(101,'张三')
insert stu values(102,'李四')
insert stu values(103,'王五')
Create table cls (clsid int,name varchar(10))
insert cls values(1,'语文')
insert cls values(2,'数学')
insert cls values(3,'英语')
declare @sql nvarchar(4000),@sql1 nvarchar(4000) ,@sql2 nvarchar(4000),@sql3 nvarchar(4000),@s nvarchar(4000)
select @sql='',@sql1='',@sql2='',@sql3=''select @sql=@sql+',['+name+']=sum(case clsid when '''+ cast(clsid as varchar(100))+''' then score else 0 end)',
--@sql2=@sql2 +',['+name+']=sum(case clsid when '''+ cast(clsid as varchar(100))+''' then score else 0 end)',
@sql1=@sql1+',['+name+'名次]=(select sum(1) from # where ['+name+']>=a.['+name+'])'
--,@sql3=@sql3+',null as ['+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 select @sql2=@sql2 +',['+name+']=cast(round(sum(case clsid when '''+ cast(clsid as varchar(100))+''' then score else 0 end)/(select count(*) from stu),0) as numeric(18,0))',
@sql3=@sql3+',null as ['+name+'名次]'
from(select sum(b.score) as score,c.clsid,c.name from sc as b inner join cls as c on c.clsid=b.clsid group by c.clsid,c.name) as a
order by clsid
set @s='select stuid 学号'+@sql+',总成绩=sum(score)
,平均分=Convert(dec(5,1),avg(score)),总名次=(select sum(1) from(select stuid
,aa=sum(score) from sc group by stuid) aa where sum(a.score)<=aa) into # from sc as a group by stuid '
print ''
print @sexec('select stuid 学号'+@sql+',总成绩=sum(score)
,平均分=Convert(dec(5,1),avg(score)),总名次=(select sum(1) from (select stuid
,aa=sum(score) from sc group by stuid) aa where sum(a.score)<=aa) into # from sc as a group
by stuid
select b.stuname as 姓名,a.*'+@sql1+'
from # a inner join stu b on a.学号=b.stuid
union
select ''最后均分'' as 姓名,a.*'+@sql3+'
from ((select null as 学号'+@sql2+',null as 总成绩 ,null as 平均分, null as 总名次
from sc)) a left join stu b on a.学号=b.stuid order by 姓名') drop table sc,stu,cls
/*
--执行结果:
姓名 学号 语文 数学 英语 总成绩 平均分 总名次 语文名次 数学名次 英语名次
李四 102 70.0 80.0 79.0 229.0 76.3 3 3 3 2
王五 103 165.0 99.0 0.0 264.0 88.0 1 1 1 3
张三 101 75.0 89.0 89.0 253.0 84.3 2 2 2 1
最后均分 NULL 103.0 89.0 56.0 NULL NULL NULL NULL NULL NULL*/