邹建写的语句,我初学水平太——执行不了,谁来帮我看看,只有60分了!!!

yexd1 2005-03-18 03:45:58
我得问题是关于成绩统计的,问题描述:我的成绩表是这样的[学号 姓名 年级 班级 科目 考试类型 分数],如果要统计某一科的成绩是没有问题的,但统计某班各科的成绩时遇到了一个问题:假设我要统计一年级三班各科的及格率的情况,但是我根本不知道一年级三班有几科(在成绩表里面),对于这种统计字段的数目不清楚的情况下怎么办呢?比如 select @x1,@x2,@x3,@xi from .....此时[i]的值不确定,我怎么确定我的传递参数呢?
邹建的回答:(我执行不了,帮我看看)
如果从成绩表取科目,可以用动态语句

declare @s nvarchar(4000)
set @s=''
select @s=@s+','+quotename(科目)+'=max(case 科目 when '+quotename(科目,'''')+' then 成绩 end)'
from 成绩表
where 班级='xx'
group by 科目
exec('select 学号'+@s+'
from 成绩表
where 班级=''xx''
group by 学号')

...全文
185 点赞 收藏 12
写回复
12 条回复
yexd1 2005年03月19日
我想再问问,对这种纵向表格我现在知道了计算平均分、及格率、分数段的基本方法,但是我不好计算每一个人的总分,比如优生率,有什么办法吗?先谢谢啦!
回复 点赞
yexd1 2005年03月18日
谢谢邹建,我好好学习学习这么经典的语句!
回复 点赞
处理及格率上面已经演示了,优生率也都是类似的处理方法,自己动动脑吧
回复 点赞
yexd1 2005年03月18日
谢谢各位,这样好不容易才把科目和成绩找出来,那么我再什么地方处理数据呢(如:计算及格率,优生率...)说说方法吧???
回复 点赞
处理中涉及到的函数作用及用法看sql联机帮助
回复 点赞
--测试表
create table 成绩表(学号 int,姓名 nvarchar(10),年级 nvarchar(10),班级 nvarchar(10),科目 nvarchar(10),考试类型 nvarchar(10),分数 int)
insert 成绩表 select 1,'张三','一年级','一班','语文',1,100
insert 成绩表 select 1,'张三','一年级','一班','数学',1,50
insert 成绩表 select 2,'李四','一年级','一班','语文',1,100
insert 成绩表 select 2,'李四','一年级','一班','数学',1,100
insert 成绩表 select 3,'王五','一年级','一班','语文',1,50
insert 成绩表 select 3,'王五','一年级','一班','数学',1,50
insert 成绩表 select 4,'王五','二年级','一班','语文',1,100
go

declare @s nvarchar(4000)
set @s=''
select @s=@s+','+quotename(科目)
+'=isnull(sum(case when 科目='
+quotename(科目,'''')+' and 分数>=60 then 100.0 end),0)/sum(case when 科目='
+quotename(科目,'''')+' then 1 end)'
from 成绩表
where 年级='一年级' and 班级='一班'
group by 科目
set @s=stuff(@s,1,1,'')
exec('select --学号
'+@s+'
from 成绩表
where 年级=''一年级'' and 班级=''一班''
--group by 学号')
go

drop table 成绩表

/*--结果

数学 语文
---------------------------------------- --------------
33.333333 66.666666

--*/
回复 点赞
yexd1 2005年03月18日
再请问xluzhong:quotename(科目,'''')的执行效果是什么?
还有这句话select @s=@s+','+quotename(科目,'''')+'=max(case 科目 when '+quotename(科目,'''')+' then 成绩 end)'
from 成绩表
where 班级='xx'
group by 科目
是把科目依次显示出来吗?如 语文 数学 ...
88  88 ...
90  77 ...
90 88 ...
... ... ...
如果我要统计及格率怎么办?
回复 点赞
子陌红尘 2005年03月18日
declare @s nvarchar(4000)
set @s=''

select @s=@s+','+quotename(科目)+'=max(case 科目 when '+quotename(科目,'''')+' then 成绩 end)'
from 成绩表
where 班级='xx'
group by 科目

set @s = 'select 学号'+@s+' from 成绩表 where 班级=''xx'' group by 学号'

--看不明白不要紧,先把动态SQL语句打印出来看一下:
print @s

exec(@s)
回复 点赞
--测试表
create table 成绩表(学号 int,姓名 nvarchar(10),年级 nvarchar(10),班级 nvarchar(10),科目 nvarchar(10),考试类型 nvarchar(10),分数 int)
insert 成绩表 select 1,'张三','一年级','一班','语文',1,100
insert 成绩表 select 1,'张三','一年级','一班','数学',1,100
insert 成绩表 select 2,'李四','一年级','一班','语文',1,100
insert 成绩表 select 2,'李四','一年级','一班','数学',1,100
insert 成绩表 select 3,'王五','一年级','一班','语文',1,100
insert 成绩表 select 3,'王五','一年级','一班','数学',1,100
insert 成绩表 select 4,'王五','二年级','一班','语文',1,100
go

declare @s nvarchar(4000)
set @s=''
select @s=@s+','+quotename(科目)+'=max(case 科目 when '+quotename(科目,'''')+' then 分数 end)'
from 成绩表
where 年级='一年级' and 班级='一班'
group by 科目
exec('select 学号'+@s+'
from 成绩表
where 年级=''一年级'' and 班级=''一班''
group by 学号')
go

drop table 成绩表

/*--结果
学号 数学 语文
----------- ----------- -----------
1 100 100
2 100 100
3 100 100
--*/
回复 点赞
631799 2005年03月18日
不明白
回复 点赞
niuniu777 2005年03月18日
你用print 命令,把整个语句显示出来,在好好分析吧.
回复 点赞
xluzhong 2005年03月18日
declare @s nvarchar(4000)
set @s=''
select @s=@s+','+quotename(科目,'''')+'=max(case 科目 when '+quotename(科目,'''')+' then 成绩 end)'
from 成绩表
where 班级='xx'
group by 科目
exec('select 学号'+@s+'
from 成绩表
where 班级=''xx''
group by 学号')
回复 点赞
发动态
发帖子
应用实例
创建于2007-09-28

1.1w+

社区成员

6.8w+

社区内容

MS-SQL Server 应用实例
社区公告
暂无公告