数据库多表链接查询

来源:百度知道 编辑:UC知道 时间:2024/06/09 10:05:17
ORACLE数据库

表EXAMS(考试信息表)
包含列(EXAMID,EXAMNAME,PASSSCORE)
主键EXAMID PASSSCORE为该试卷的及格分数

表EXAMSCORE(考试成绩表)
包含列(ESID,EXAMID,USERID,SCORE)
主键ESID SCORE为该试卷用户的得分

表EXAMUSE(考试分配表,统计需要参加考试的用户)
包含列(EUID,EXAMID,USERID)
主键EUID

表GROUPDIRECTORY(部门信息表)
包含列(DIRID,DIRNAME,GROUPID)
主键DIRID DIRNAME为部门的名称

表GROUPS(机构信息表)
包含列(GROUPID,GROUPNAME)
主键GROUPID GROUPNAME为机构的名称

表USERS(用户信息表)
包含列(USERID,GROUPID,DIRID)
主键USERID GROUPID为用户所属机构编号,DIRID为用户所属部门编号

1.求参加某次考试(如:001)的机构列表,需要包含显示信息(机构名称,应考人数,实考人数,及格人数,平均分,最高分,最低分),包括实考人数为0的机构也需要显示

2.求参加某次考试(如:001)的某机构(如:002)的部门列表,需要包含显示信息(部门名称,应考人数,实考人数,及格人数,平均分,最高分,最低分),包括应考人数为0的部门也需要显示

回答正确再加分

根据你发来的数据以及和你的交流,如下sql可以满足你的要求。
虽然你已经用自己的方法解决了,我还是想发上来共享下:

****************
问题1:
****************
select t1.GROUPNAME,
nvl(count(t3.U1),0) as 应考人数,
nvl(count(t3.U2),0) as 实考人数,
sum(case when nvl(t3.SCORE,0)<nvl(t3.PASSSCORE,0) or nvl(t3.SCORE,0)=0 then 0 else 1 end) as 及格人数,
nvl(avg(t3.SCORE),0) as 平均分,
nvl(max(t3.SCORE),0) as 最高分,
nvl(min(t3.SCORE),0) as 最低分
from GROUPS t1,USERS t2,
( select tt1.USERID U1,tt1.EXAMID,tt2.USERID U2,tt2.SCORE,tt3.PASSSCORE
from EXAMUSE tt1 left join EXAMSCORE tt2 on tt1.USERID=tt2.USERID and tt1.EXAMID=tt2.EXAMID
inner join EXAMS tt3 on tt1.EXAMID=tt3.EXAMID
where tt1.EXAMID='001'
) t3
where t1.GROUPID = t2.GROUPID(+)
and t2.USERID = t3.U1(+)
group by t1.GROUPNAME
order by 2 desc;

*********
测试log:
******