create table tbstudent
(
 Sno varchar2(10) not null,
 Sname varchar2(10)not null,
 SBirthday date ,
 SSex char(2)
);create table Tbscore
(
 Sno varchar2(10)not null,
 Subject varchar2(10)not null,
 Score number ,
 primary key (Sno,Subject)
);
这是两张表的字段 两张表的数据如下
1.tbstudent
SNO        SNAME      SBIRTHDAY   SSEX
---------- ---------- ----------- ----
Y20101     张一某     1982-12-15  男
Y20102     王强       1983-9-21   男
Y20103     赵敏       1984-5-8    女
Y20104     李斯       1982-3-9    男
2、tbscore
SNO        SUBJECT         SCORE
---------- ---------- ----------
Y20101     XML                88
Y20102     XML                66
Y20103     XML                55
Y20104     XML                78
Y20101     ORACLE             64
Y20102     ORACLE             58
Y20103     ORACLE             44有一下4个问题
A、 编写SQL语句查询男同学的XML平均成绩,要求列出姓名和成绩两列;
B、 编写SQL语句查询出参加考试的各科成绩都及格的学员学号、平均成绩;
C、 用一条SQL语句,查询出科目、该科目成绩60分以上的学生个数;
D、 由于ORACLE的测试题目过难,导致大部分员考试成绩偏低,现要求你编写一个存储过程实现给指定科目的成绩提分,通过调用该过程plus(‘ORACLE’)实现给ORACLE科目提分。具体提分算法如下:给98分以下的每个人都加3分,若全班通过率达不到70%,则再给98分以下的每个人加3分,直到全班通过率达到70%为止。越看这些问题越迷糊,希望oracle高手给以答案。谢谢

解决方案 »

  1.   

    a好像题目有点问题
     需要的结果不清楚
    男同学的XML平均成绩只会出来一个值
    要求列出姓名和成绩两列 是所有男同学的XML成绩
      

  2.   

    bSELECT snmae,avg_score
      FROM (SELECT   a.sname, avg(score) avg_score,COUNT (b.cno) tot_c,
                     SUM (DECODE (SIGN (b.score - 60), -1, 0, 1)) over_60
                FROM tbstudent  a, Tbscore  b
               WHERE a.Sno = b .Sno
            GROUP BY a.sname)
     WHERE tot_c = over_60
      

  3.   

    C
    SELECT   subject, sum(DECODE (SIGN (score - 60), -1, 0, 1)) num
        FROM tbscore a
    GROUP BY subject
      

  4.   

    C
    select sc.subject,count(st.sno) from tbstudent st,tbscore sc where st.sno=sc.sno and sc.score>60
     group by sc.subject 
      

  5.   

    A.select a.name , avg(b.score) from tbstudent a, tbscore b where a.sno = b.sno and a.ssex = '男'
    and b.subject = 'xml' group by a.name不知道是不是你要的结果
      

  6.   

    最后一个
    create or replace procedure addscore(subject tbscore.subject%type) is
     v_total number:=0;
     v_pass number:=0;
     v_Rate number:=0;
    begin
    loop
         update tbscore sc set sc.score= sc.score+3 where sc.subject=subject and sc.score<98;
         commit;
         select count(sc.sno) into v_total from tbscore sc where sc.subject=subject;
         select count(sc.sno) into v_pass from tbscore sc where sc.subject=subject and sc.score>=60;
         v_Rate:=v_pass/v_total;
    exit when v_rate>=0.7;  
    end loop;   
    end addscore;
      

  7.   

    A
    SELECT A.NAME, AVG(B.SCORE)
      FROM TBSTUDENT A, TBSCORE B
     WHERE A.SNO = B.SNO
       AND A.SSEX = '男'
       AND B.SUBJECT = 'XML'
     GROUP BY A.NAME
    楼主注意理解下答案的意思啊,6楼的只是XML小写导致查不出结果