服务器: 消息 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

解决方案 »

  1.   

    --两处错误:
    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') 
      

  2.   

    并且我在C#中连接此SQL需要在web中显示这个查询的结果
    又应该怎么做?
      

  3.   


    --增加平均分数行记录
    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*/