数据库如下
http://cms.bit.edu.cn/moodle/file.php?file=/222/%E6%95%B0%E6%8D%AEjpg.JPG需要生成交叉表如下http://cms.bit.edu.cn/moodle/file.php?file=/222/%E7%BB%93%E6%9E%9Cjpg.JPGSQL语句如下:
declare @s nvarchar(4000)
set @s=''
select @s=@s+','+'avg(case 课程 when '+课程+'then 成绩 else null end)'
from stu group by 课程
exec('select 姓名'+@s+' from stu group by 姓名')
go 出现错误
服务器: 消息 207,级别 16,状态 3,行 1
列名 '编译原理' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 '操作系统' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 '计算机网络' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 '数据库' 无效。
why?
http://cms.bit.edu.cn/moodle/file.php?file=/222/%E6%95%B0%E6%8D%AEjpg.JPG需要生成交叉表如下http://cms.bit.edu.cn/moodle/file.php?file=/222/%E7%BB%93%E6%9E%9Cjpg.JPGSQL语句如下:
declare @s nvarchar(4000)
set @s=''
select @s=@s+','+'avg(case 课程 when '+课程+'then 成绩 else null end)'
from stu group by 课程
exec('select 姓名'+@s+' from stu group by 姓名')
go 出现错误
服务器: 消息 207,级别 16,状态 3,行 1
列名 '编译原理' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 '操作系统' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 '计算机网络' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 '数据库' 无效。
why?
set @s=''
select @s=@s+','+'avg(case 课程 when '''+课程+''' then 成绩 else 0 end)'
from stu group by 课程 exec('select 姓名'+@s+' from stu group by 姓名')
go
set @s=''
select @s=@s+','+'avg(case 课程 when '''+课程+''' then 成绩 else 0 end)'
from stu group by 课程
print @s你运行一下这个就知道why了……@s经过赋值后,when后面接的课程应该是字符串,比如 '编译原理' ,'操作系统' 等等,它们都必须用单引号括起来作为字符串常量。
你原来写的语句没加单引号,致使系统认为编译原理、操作系统都是列名,显然就出错了。
如果要加一个单引号,必须用另一个单引号作为转义符。因此你看见了:when '''+课程+''' 这样形式的串。将print出来的sql语句拷到查询分析器里,仔细看看,再执行一下,就能完全明白了。
declare @s nvarchar(4000)
set @s='select 姓名'
select @s=@s+ 'avg(case 课程 when + ''' + 课程 + ''' then 成绩 else null end)'
from stu group by 课程
set @s=@s+ 'from stu group by 姓名'
exec(@s)
declare @s nvarchar(4000)
set @s='select 姓名'
select @s=@s+ ',' + 'avg(case 课程 when + ''' + 课程 + ''' then 成绩 else null end)'
from stu group by 课程
set @s=@s+ 'from stu group by 姓名'
exec(@s)