SQL查询难题,高手快来

乾朗 2010-09-10 01:12:15
要求:查询每个试题的正确率
--学员
create table student (
id number(19,0) not null,
name varchar2(255 char),
primary key (id)
)
--试题
create table exam_question (
id number(19,0) not null,
content clob,
score double precision,
primary key (id)
)
--选项
create table exam_choose (
id number(19,0) not null,
chooseItem varchar2(255 char),
contentString clob,
primary key (id)
)
-----------------------------------------------------
--试题对应的选项
create table exam_question_choose (
question_id number(19,0) not null,
choose_id number(19,0) not null,
primary key (question_id ,choose_id)
)
--试题对应的正确答案选项
create table exam_question_rightchoose (
question_id number(19,0) not null,
choose_id number(19,0) not null,
primary key (question_id ,choose_id)
)
--学生提交某个试题的答案
create table exam_exam_studentAnswer (
id number(19,0) not null,
question_id number(19,0),
student_id number(19,0),
primary key (id)
)
--试题的答案包含一或多个选项
create table exam_studentanswer_choose (
examStudentAnswer_id number(19,0) not null,
choose_id number(19,0) not null
)

要求:查询每个试题的正确率
结果结构如下:
question_id right_rate
...全文
550 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lg200015017 2010-09-18
  • 打赏
  • 举报
回复


Select aaa.QUESTION_ID,round(Count(Case When bbb.q_id Is Null Then 1 End)/Count(*)*100 ,2)||'%' right_rate
From exam_exam_studentAnswer aaa
Left Join (
----谁答错了
Select Distinct decode(aa.CHOOSE_ID ,Null,bb.QUESTION_ID,aa.QUESTION_ID) q_id
,decode(aa.CHOOSE_ID ,Null,bb.STUDENT_ID,aa.STUDENT_ID) s_id
From
(
select a.QUESTION_ID,a.STUDENT_ID,b.CHOOSE_ID from exam_exam_studentAnswer a
Join exam_question_rightchoose b On a.QUESTION_ID = b.QUESTION_ID
) aa
Full Outer Join
(
select a.QUESTION_ID,a.STUDENT_ID,d.CHOOSE_ID from exam_exam_studentAnswer a
Left Join exam_studentanswer_choose d On a.Id = d.EXAMSTUDENTANSWER_ID
) bb
On aa.QUESTION_ID = bb.QUESTION_ID And aa.STUDENT_ID = bb.STUDENT_ID And aa.CHOOSE_ID = bb.CHOOSE_ID
Where aa.CHOOSE_ID Is Null Or bb.CHOOSE_ID Is Null
) bbb
On aaa.QUESTION_ID = bbb.q_id And aaa.STUDENT_ID = bbb.s_id
Group By aaa.QUESTION_ID
hexj002 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 redpan 的回复:]
--试题答案包含一或多个选项
exam_studentanswer_choose (examStudentAnswer_id,choose_id)

这个表的描述不清楚,在我理解这个应该是学生做的试题的答案选择
[/Quote]

question_id, student_id,choose_id 可以放在一张表中但会有一个试题有多个选中答案,现在是分别放在 exam_studentAnswer和exam_studentanswer_choose中来减少数据冗余
乾朗 2010-09-17
  • 打赏
  • 举报
回复
存储过程实现也行,有兴趣的朋友可以试试
乾朗 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 redpan 的回复:]
--试题答案包含一或多个选项
exam_studentanswer_choose (examStudentAnswer_id,choose_id)

这个表的描述不清楚,在我理解这个应该是学生做的试题的答案选择
[/Quote]
因为设计里试题不一定是不定项选择题,这个examStudentAnswer 是学员对一个试题提交的答案,这个答案可以有选项或其他类型试题关联,针对不定项选择题就有 exam_studentanswer_choose,这个答案可以有多个选中的选项,不定项选择题只有所有选项全选对才算正确
乾朗 2010-09-16
  • 打赏
  • 举报
回复
针对消除数据冗余的设计
redpan 2010-09-15
  • 打赏
  • 举报
回复
如果是的话,examStudentAnswer_id是什么意思?
这张表应该提供->学生ID,试题ID,选择ID 这三个的唯一关系,才可以进行计算。
redpan 2010-09-15
  • 打赏
  • 举报
回复
--试题答案包含一或多个选项
exam_studentanswer_choose (examStudentAnswer_id,choose_id)

这个表的描述不清楚,在我理解这个应该是学生做的试题的答案选择
hexj002 2010-09-15
  • 打赏
  • 举报
回复
没有高手看到吗?帮顶
Cike121272604 2010-09-15
  • 打赏
  • 举报
回复
难得一见的题,现在忙,不过得先收藏。
乾朗 2010-09-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hexiaojiao 的回复:]
一条exam_exam_studentAnswer 记录代表
一个学员提交一个试题的答案
这个答案可有多个选项
exam_studentanswer_choose 就是这个答案和选择的选项关联表
[/Quote]
请见3楼
顶起不沉帖!
乾朗 2010-09-10
  • 打赏
  • 举报
回复
表结构

student (id,name)--学员

exam_question (id,content)--试题

exam_choose (id,content)--选项
------------------------------------
--试题的选项
exam_question_choose (question_id,choose_id )

--试题正确答案
exam_question_rightchoose (question_id, choose_id)

--学生提交某个试题的答案
exam_studentAnswer(id, question_id, student_id)

--试题答案包含一或多个选项
exam_studentanswer_choose (examStudentAnswer_id,choose_id)
要求:查询每个试题的正确率


测试数据

insert into student values(1,'Anna');
insert into student values(2,'Bob');
insert into student values(3,'Rose');
insert into student values(4,'Dulu');
insert into student values(5,'John');

insert into exam_question(id) values(1);
insert into exam_question(id) values(2);
insert into exam_question(id) values(3);
insert into exam_question(id) values(4);

insert into exam_choose (id,chooseItem) values(1,'A');
insert into exam_choose (id,chooseItem) values(2,'B');
insert into exam_choose (id,chooseItem) values(3,'C');
insert into exam_choose (id,chooseItem) values(4,'A');
insert into exam_choose (id,chooseItem) values(5,'B');
insert into exam_choose (id,chooseItem) values(6,'D');
insert into exam_choose (id,chooseItem) values(7,'C');

insert into exam_question_choose values(1,1);
insert into exam_question_choose values(1,2);
insert into exam_question_choose values(1,3);
insert into exam_question_choose values(1,6);
insert into exam_question_choose values(2,4);
insert into exam_question_choose values(2,5);
insert into exam_question_choose values(2,7);
insert into exam_question_choose values(2,6);
insert into exam_question_choose values(3,4);
insert into exam_question_choose values(3,5);
insert into exam_question_choose values(3,7);
insert into exam_question_choose values(3,6);
insert into exam_question_choose values(4,1);
insert into exam_question_choose values(4,2);
insert into exam_question_choose values(4,3);
insert into exam_question_choose values(4,6);

insert into exam_question_rightchoose values(1,3);
insert into exam_question_rightchoose values(1,6);
insert into exam_question_rightchoose values(2,5);
insert into exam_question_rightchoose values(2,6);
insert into exam_question_rightchoose values(3,5);
insert into exam_question_rightchoose values(4,3);

insert into exam_exam_studentAnswer values(1,1,1);
insert into exam_exam_studentAnswer values(2,2,1);
insert into exam_exam_studentAnswer values(3,3,1);
insert into exam_exam_studentAnswer values(4,4,1);
insert into exam_exam_studentAnswer values(5,1,2);
insert into exam_exam_studentAnswer values(6,2,2);
insert into exam_exam_studentAnswer values(7,3,2);
insert into exam_exam_studentAnswer values(8,4,2);
insert into exam_exam_studentAnswer values(9,1,3);
insert into exam_exam_studentAnswer values(10,2,3);
insert into exam_exam_studentAnswer values(11,3,3);
insert into exam_exam_studentAnswer values(12,4,4);

insert into exam_studentanswer_choose values(1,3);
insert into exam_studentanswer_choose values(1,6);
insert into exam_studentanswer_choose values(2,5);
insert into exam_studentanswer_choose values(2,6);
insert into exam_studentanswer_choose values(3,5);
insert into exam_studentanswer_choose values(4,3);
ngx20080110 2010-09-10
  • 打赏
  • 举报
回复
能提供一點測試數據嗎?
乾朗 2010-09-10
  • 打赏
  • 举报
回复
一条exam_exam_studentAnswer 记录代表
一个学员提交一个试题的答案
这个答案可有多个选项
exam_studentanswer_choose 就是这个答案和选择的选项关联表
ADO.NET 2.0技术内幕(高清 中文 带书签 全) 编辑推荐 核心主题全面涵盖,深入剖析个人精髓;示例丰富,同时提供Visual Basic和Visual C#两种版本;独特的常见问题解析方式可使难题迎刃而解。 引导开发人员创建分布式、以数据为中心的应用程序的权威指南。 本书可以使您的专业知识不再停留在基础阶段,它会引领您深入研究ADO.NET 2.0的重要编程主题。本书作为全面的技术内幕参考书,提供了专家指南、实用指令及用Visual c#和Visual Basic编写的代码示例,帮助您深入掌握如何开发Micrsoft Windows和Web数据库应用程序。 本书重要主题:在Microsoft Visual Studio 2005中使用设计时数据访问特性;使用Microsoft .NET Framework 2.0数据提供程序连接数据库;构建连接字符串,启用连接池;执行查询,包括参数化查询和非同步查询,并获取结果;创建DataSet对象以处理脱机数据,并研究常用场景;使用Microsoft SQL Server 2005中新的公共语言运行时特性和XML数据类型;为简单和复杂的更新生成逻辑和使用存储过程;使用ASP.NET 2.0中的新数据访问性设计Web应用程序——包括无代码数据绑定功能。 内容简介 本书介绍了如何用ADO.NET 2.0对独立应用、企业级应用和Web应用程序中的数据进行访问、排序和操作。作者针对如何利用Visual Studio 2005中的新工具和向导,编写、测试并调试数据库应用程序代码,用丰富的示例代码、教程式的风格及特色段落介绍了最佳实践。本书描述了ADO.NET对象模型及其用于Web扩展的XML特性,还涉及Microsoft SQL Server 2000和SQL Server 2005以及其他一些核心主题。 本书学习ADO.NET的理想参考书,也是造就专业编程高手的指南,适用于所有在.NET应用程序中编写数据访问代码的人员。 作者简介 斯赛帕,David Sceppa,SQL Server开发团队的项目经理,也是ADO.NET专家。作为Microsoft Developer Support团队的前技术邻导人,他曾经帮助客户使用Visual Basic和Microsoft Visual FoxPro来构建数据库应用程序。David拥有微软.NET MCSD认证,并有丰富的教学经验。 目录 第Ⅰ部分 Microsoft ADO.NET 2.0入门 第1章 ADO.NET概述 1.1 没有新的对象模型 1.2 ADO.NET对象模型 1.3 常见问题 第2章 用Microsoft Visual Studio 2005生成第一个ADO.NET应用程序 2.1 演示 2.2 不编写代码而生成数据访问窗体 2.3 常见问题 第Ⅱ部分 获取连接:使用.NET数据提供程序 第3章 连接数据库 3.1 生成SqlConnection对象 3.2 打开SqlConnection对象 3.3 关闭SqlConnection对象 3.4 自行清除连接 3.5 连接字符串 3.6 连接池 3.7 将SqlConnection用作起始点 3.8 Visual Studio设计时特性 3.9 SqlConnection对象参考 3.10 常见问题 第4章 数据库查询 4.1 在代码中使用SqlCommand对象 4.2 使用SqlDataReader 4.3 使用参数化查询 4.4 Microsoft Visual Studio设计时特性 4.5 SqlCommand,SqlDataReader和SqlParameter的对象参考 4.6 常见问题 第5章 用SqlDataAdapfer对象获取数据 5.1 何为SqlDataAdapter对象 5.2 创建并使用SqlDataAdapter对象 5.3 Visual Studio 2005设计时特性 5.4 SqlDataAdapter参考 5.5 常见问题 第Ⅲ部分 处理脱机数据——ADO.NET DataSet 第6章 处理DataSet对象 6.1 DataSet类的特性 6.2 使用DataSet对象 6.3 在Visual Studio中处理DataSet对象 6.4 DataSet,DataTable,DataColumn,DataRow,UniqueConstraint和ForeignKeyConstraint类参考 6.5 常见问题 第7章 处理关系数据 7.1 关系数据访问概述 7.2 在代码中使用DataRelation对象 7.3 在Microsoft Visual Studio中创建DataRelation对象 7.4 DataRelation对象参考 7.5 常见问题 第8章 排序、搜索和筛选 8.1 使用DataTable类的搜索和筛选功能 8.2 何为DataView对象 8.3 在代码中使用DataView对象 8.4 在Visual Studio中创建DataView对象 8.5 DataView对象参考 8.6 常见问题 第9章 使用强类型DataSet对象和TableAdapter 9.1 强类型DataSet 9.2 创建强类型DataSet对象 9.3 使用强类型DataSet对象 9.4 何时使用强类型DataSet对象 9.5 TableAdapter简介 9.6 选择自己的方法 9.7 常见问题 第10章 向数据库中提交更新 10.1 使用参数化SqlCommand提交更新 10.2 使用SqlDataAdapter提交更新 10.3 使用SqlDataAdapter对象提交更新 10.4 手动配置SqlDataAdapter对象 10.5 使用SqlCommandBuilder对象生成更新逻辑 10.6 使用Visual Studio【TableAdaptet 配置向导】生成更新逻辑 10.7 返回DataAdapter 10.8 在SqlTransaction中提交更新 10.9 SqlCommandBuildet对象参考 10.10 常见问题 第11章 复杂更新 11.1 在提交更新后刷新一行 11.2 获取新生成的自动增量值 11.3 提交分层更改 11.4 分离和重新集成更改 11.5 处理失败的更新尝试 11.6 使用分布式事务 11.7 批量查询 11.8 SQL批量复制 11.9 DataSet对象与事务 11.10 在处理复杂更新方案时,使用AD0.NET 11.11 常见问题 第12章 使用XML数据 12.1 架起XML和数据访问之间的桥梁 12.2 读写XML数据 12.3 DataSet+XmlDocument=XmlDataDocument 12.4 使用SQL Server 2005的XML特性 12.5 通过SElECT...FOR XML从SQL Server 2000中获取XML数据 12.6 SQL XML.NET数据提供程序 12.7 简单的AD0.NET和XML示例 12.8 常见问题 第Ⅳ部分 用ADO.NET 2.O构造高效的应用程序 第13章 生成基于WindOWS的高效应用程序 13.1 用数据绑定快速生成用户界面 13.2 应用程序设计的考虑事项 第14章 生成高效的Web应用程序 14.1 Web应用程序简介 14.2 连接到数据库 14.3 在ASP.NET 1.0中与数据库进行交互时存在的问题 14.4 数据源控件简介 14.5 缓存往返的数据 14.6 分页 14.7 常见问题 第15章 SQL Server2005公共语言运行时集成 15.1 扩展SQL Server的旧方法——扩展存储过程 15.2 扩展SQL Server的新方法——CLR集成 15.3 使用Microsoft Visual Studio 2005简化SQL CLR代码的生成过程 15.4 SQL CLR方案 15.5 创建SQL CLR用户定义类型 15.6 小结 15.7 常见问题 第Ⅴ部分 附录 附录A 使用其他.NET数据提供程序 附录B 示例和工具

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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