救命呀,高难问题。急....

melodycx 2006-07-11 11:19:52
我现在需要做一个成绩统计
每次考试科目不一定一样
成绩表结构为:
score_id 学生ID 考试ID 科目ID 成绩

要求输出是以下几种效果:
1.按学校显示(年级已定)
科目1 科目2 ... 总分
学校名 最高分 最低分 平均分 最高分 最低分 平均分 ... 最高分 最低分 平均分
学校1 100 1 56 98 54 87 ... 482 231 321
学校2 100 1 56 98 54 87 ... 482 231 321

2.按班级显示(年级已定)
科目1 科目2 ... 总分
班级名 最高分 最低分 平均分 最高分 最低分 平均分 ... 最高分 最低分 平均分
班级1 100 1 56 98 54 87 ... 482 231 321
班级2 100 1 56 98 54 87 ... 482 231 321

3.按个人显示
学生名 科目1 科目2 ... 总分
学生1 65 76 ... 432
学生2 65 76 ... 432

4.按个人每次成绩显示(学生已定)
考试名 科目1 科目2 ... 科目N
考试1 65 66 ... 76
考试2 65 66 ... 76


各位老大一定一定一定要帮忙啊...
成绩表结构不合理的话可以更改

谢谢 谢谢...
...全文
361 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
melodycx 2006-07-11
  • 打赏
  • 举报
回复
问一下
上面的动态SQL是用在存储过程中的吗?
子陌红尘 2006-07-11
  • 打赏
  • 举报
回复
先处理简单的:

3、
declare @sql varchar(8000)
set @sql=''
select @sql=@sql+',['+rtrim(科目ID)+']=max(case 科目ID when '+rtrim(科目ID)+' then 成绩 end)' from 成绩表 group by 科目ID order by 科目ID
set @sql='select 学生ID'+@sql+',总分=sum(成绩) from 成绩表 group by 学生ID'
exec(@sql)


4、
declare @sql varchar(8000),@StudentID int
set @sql=''
set @StudentID=xxx
select @sql=@sql+',['+rtrim(科目ID)+']=max(case 科目ID when '+rtrim(科目ID)+' then 成绩 end)' from 成绩表 where 学生ID=@StudentID group by 科目ID order by 科目ID
set @sql='select 考试ID'+@sql+' from 成绩表 where 学生ID='+rtrim(@StudentID)+' group by 考试ID'
exec(@sql)
melodycx 2006-07-11
  • 打赏
  • 举报
回复
是不是名字没取好?
么人理.
......
melodycx 2006-07-11
  • 打赏
  • 举报
回复
我都到邹老大BLOG里偷窥N久了
实在找不到办法

..............
melodycx 2006-07-11
  • 打赏
  • 举报
回复
报表工具.
要给钱买的咩?如果是 那就么法
公司不给钱买 T_T...
LouisXIV 2006-07-11
  • 打赏
  • 举报
回复
不要老是把报表工具可以做的事情交给SQL来做
fcuandy 2006-07-11
  • 打赏
  • 举报
回复
又是行转列
melodycx 2006-07-11
  • 打赏
  • 举报
回复
我的分都全部奉送了...
T_T.....
melodycx 2006-07-11
  • 打赏
  • 举报
回复
云中客~
那报表工具是单机版的?
我想用到WEB里呢
melodycx 2006-07-11
  • 打赏
  • 举报
回复
嗯呢~
我去试试~
谢谢楼上各位

有什么好的方法请继续教教我

^_^^_^^_^
melodycx 2006-07-11
  • 打赏
  • 举报
回复
哦 有学校\年级\班级\科目\考试\成绩表

v_school_grade_class_student_score 这个就是视图

我也想过生成临时表
但是没用过 不知道这种不定列的该怎么做.
云中客 2006-07-11
  • 打赏
  • 举报
回复
成绩表设计不合理,或者是不是还有一个学生信息表,否则学生所属班级/学校的信息从何而来

思路:
1.子陌已经将3. 4.的问题解答出来,可以将这两个表生成临时表
2.利用学生ID与学生信息表中的学生ID关联后,生成一个新视图或者用语句来实现也可以
3.此时这个虚拟表中每个学生的各科成绩,也有这个学生所属班级及学校的信息
对这个虚拟表进行分类汇总,达到楼主所要的1 2的要求
4.但是对于楼主需要的这种格式,对于SQL一个数据为系统来说,有些困难,建议使用一些控件或工具来完成(最近有一个Grid++Report的报表控件,可以免费使用(http://www.rubylong.cn/),楼主可以试试)
melodycx 2006-07-11
  • 打赏
  • 举报
回复
declare @sql varchar(8000),@test bigint
set @test=2
set @sql=''
select @sql=@sql+',['+rtrim(subject_name)+'(最高)'+']=max(case subject_id when '+rtrim(subject_id)+' then score_val end),['+rtrim(subject_name)+'(最低)'+']=min(case subject_id when '+rtrim(subject_id)+' then score_val end),['+rtrim(subject_name)+'(平均)'+']=avg(case subject_id when '+rtrim(subject_id)+' then score_val end)' from v_school_grade_class_student_score group by subject_id,subject_name order by subject_id,subject_name
set @sql='select 班级名=class_name'+@sql+',总分=sum(score_val) from v_school_grade_class_student_score where test_id='+rtrim(@test)+' group by class_name'
exec(@sql)




疯了.
好丑.
melodycx 2006-07-11
  • 打赏
  • 举报
回复
2.按班级显示(年级已定)
班级名 最高分(科目1) 最低分(科目1) 平均分(科目1) 最高分(科目2) 最低分(科目2) 平均分(科目2) ... 最高分( 总分) 最低分( 总分) 平均分( 总分)
班级1 100 1 56 98 54 87 ... 482 231 321
班级2 100 1 56 98 54 87 ... 482 231 321


如果把上面的表头换成这种形式的呢?
melodycx 2006-07-11
  • 打赏
  • 举报
回复
Reporting Servies 是自带的吗?

我刚查了下 好象要下载?
LouisXIV 2006-07-11
  • 打赏
  • 举报
回复
前面那种带表头的不是SQL能完成的

用自带的ReportingServies也可以做出来
melodycx 2006-07-11
  • 打赏
  • 举报
回复
那前面的呢?.........................
我都要疯了.
云中客 2006-07-11
  • 打赏
  • 举报
回复
关注一下,吃饭回来细看
子陌红尘 2006-07-11
  • 打赏
  • 举报
回复
上面的动态SQL是用在存储过程中的吗?
---------------------------------------------------------------------
可以放在存储过程中,也可以作为SQL块直接执行。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧