日期:2014-05-16  浏览次数:21049 次

一个查询问题,主要是要增加说明列 求指教
事件描述:公司人力资源系统的数据库记录了每位员工的培训信息,有如下3张表:
STAFF (Sno,Sname,Sdept,Sage) Sno,Sname,Sdept,Sage 分别代表学号、学员姓名、所属单位、学员年龄
COURSE (Cno,Cname ) Cno,Cname 分别代表课程编号、课程名称
SCRELATION ( Sno,Cno,Grade ) Sno,Cno,Grade 分别代表学号、所选修的课程编号、学习成绩



查询每个单位所选修课程的最高分和最低分的学员学号、姓名、所属单位、学习成绩,并增加最高(低)分说明列。


这个如何解决呢?主要是如何增加说明列!!求各位大哥指教!!!麻烦给出详细脚本谢谢..!!



------解决方案--------------------
select *
from (select mingrade.sdept,
mingrade.cname,
mingrade.ming 最低分,
grade.sno,
grade.sname
from (select STAFF.Sdept,
COURSE.CNAME,
min(to_number(SCRELATION.Grade)) as ming
from STAFF, COURSE, SCRELATION
where STAFF.Sno = SCRELATION.Sno
and SCRELATION.Cno = COURSE.Cno
group by STAFF.Sdept, COURSE.CNAME
order by STAFF.Sdept) mingrade,

(select STAFF.Sno,
STAFF.Sname,
COURSE.Cname,
SCRELATION.Grade,
STAFF.Sdept
from STAFF, COURSE, SCRELATION
where STAFF.Sno = SCRELATION.Sno
and SCRELATION.Cno = COURSE.Cno) grade
where mingrade.cname = grade.cname
and mingrade.Sdept = grade.sdept
and mingrade.ming = grade.grade
order by mingrade.sdept) zxcj,

(select maxgrade.sdept,
maxgrade.cname,
maxgrade.maxg 最高分,
grade.sno,
grade.sname
from (select STAFF.Sdept,
COURSE.CNAME,
max(to_number(SCRELATION.Grade)) as maxg
from STAFF, COURSE, SCRELATION
where STAFF.Sno = SCRELATION.Sno
and SCRELATION.Cno = COURSE.Cno
group by STAFF.Sdept, COURSE.CNAME
order by STAFF.Sdept) maxgrade,
(select STAFF.Sno,
STAFF.Sname,
COURSE.Cname,
SCRELATION.Grade,
STAFF.Sdept
from STAFF, COURSE, SCRELATION
where STAFF.Sno = SCRELATION.Sno
and SCRELATION.Cno = COURSE.Cno) grade
where maxgrade.cname = grade.cname
and maxgrade.Sdept = grade.sdept
and maxgrade.maxg = grade.grade
order by maxgrade.sdept) zdcj
where zxcj.sdept = zdcj.sdept
and zxcj.cname = zdcj.cname

------解决方案--------------------
SQL code

SELECT SNO,
       SNAME,
       SDEPT,
       GRADE,
       DECODE(GRADE, MAX_, '最高分', MIN_, '最低分', '程序错误')
  FROM SELECT T1.SNO,
              T1.SNAME,
              T1.SDEPT,
              T3.GRADE,
              MAX(T3.GRADE) OVER(PARTITION BY T1.SDEPT) MAX_,
              MIN(T3.GRADE) OVER(PARTITION BY T1.SDEPT) MIN_
         FROM STAFF T1, COURSE T2, SCRELATION T3
        WHERE T3.SNO = T1.SNO
          AND T3.CNO = T2.CNO)
        WHERE (GRADE = MAX_ OR GREAD = MIN_)

------解决方案--------------------
SQL code
 顶上

------解决方案--------------------
SQL code

select *
  from (select mingrade.sdept,
               mingrade.cname,
               mingrade.ming 最低分,
               grade.sno,