SQL> select * from temp3;
姓名   科目   期中成绩
------ ---- ----------
小红   语文         90
小明   语文         89
小红   英语         79
小明   英语         73
小张   语文         80
小张   英语         80SQL> select * from temp4;
姓名   科目   期末成绩
------ ---- ----------
小红   语文         82
小红   英语         79
小明   英语         82我想得到的查询结果是:
姓名   科目   期中成绩   期中名次   期末成绩   期末名次
------ ---- ---------- ---------- ---------- ----------
小张   英语         80          1                     3
小红   英语         79          2         79          2
小明   英语         73          3         82          1
小红   语文         90          1         82          1
小明   语文         89          2                     2
小张   语文         80          3                     2我所使用的方法是:
select temp3.姓名,temp3.科目,temp3.期中成绩,rank() over(partition by temp3.
科目 order by 期中成绩 desc) as 期中名次,temp4.期末成绩,rank() over(partition by
temp4.科目 order by 期末成绩 desc) as 期末名次 from temp3 left join temp4 on te
mp3.姓名=temp4.姓名 and temp3.科目=temp4.科目得到的错误结果如下:姓名   科目   期中成绩   期中名次   期末成绩   期末名次
------ ---- ---------- ---------- ---------- ----------
小张   英语         80          1                     1
小红   英语         79          2         79          2
小明   英语         73          3         82          1
小红   语文         90          1         82          1
小明   语文         89          2                     1
小张   语文         80          3                     1
想了好久了,望大虾位指点一下:

解决方案 »

  1.   

    楼主的意思就是成绩没有的就是最后名
    rank() over(partition by
    temp4.科目 order by 期末成绩 desc)
    改成这样
    rank() over(partition by
    temp4.科目 order by 期末成绩 desc nulls last)
      

  2.   

    第二个表的排序涉及到第一个表,所以,应该有两次左连接的过程。SQL> select * from a;TNAME  KM             CJ
    ------ ------ ----------
    小张   英语           80
    小张   语文           80
    小明   英语           73
    小红   英语           79
    小明   语文           89
    小红   语文           90已选择6行。SQL> select * from b;TNAME  KM             CJ
    ------ ------ ----------
    小红   语文           82
    小红   英语           79
    小明   英语           82SQL> select aa.tname,aa.km,aa.cj,aa.num,bb.cj,bb.num from
      2  (select tname,km,cj,rank() over(partition by km order by cj desc ) num from
     a ) aa,
      3  (select a.tname,a.km,b.cj,rank() over(partition by a.km order by nvl(b.cj,0
    ) desc ) num from a,b
      4  where a.tname=b.tname(+)
      5  and a.km=b.km(+)) bb
      6  where aa.tname=bb.tname
      7  and aa.km=bb.km
      8  order by 2,4;TNAME  KM             CJ        NUM         CJ        NUM
    ------ ------ ---------- ---------- ---------- ----------
    小张   英语           80          1                     3
    小红   英语           79          2         79          2
    小明   英语           73          3         82          1
    小红   语文           90          1         82          1
    小明   语文           89          2                     2
    小张   语文           80          3                     2
      

  3.   

    rank() over(partition by
    temp4.科目 order by 期末成绩 desc)
    这里面还有错误
    应该是rank() over(partition by
    temp3.科目 order by 期末成绩 desc)temp4的话,就会有空值,所以造成语文有三个排名第一名
      

  4.   


    select 姓名,
           科目,
           期中成绩,
           decode(期末成绩, 0, '', 期末成绩) 期末成绩,
           rank() over(partition by 科目 order by 期中成绩 desc) as 期中名次,
           rank() over(partition by 科目 order by 期末成绩 desc) as 期末名次
      from (select temp3.姓名,
                   temp3.科目,
                   temp3.期中成绩,
                   nvl(temp4.期末成绩, 0) 期末成绩
              from temp3, temp4
             where temp3.姓名 = temp4.姓名(+)
               and temp3.科目 = temp4.科目(+))
      

  5.   

    个人觉得 hebo2005 的最好,和我原先想的差不多,呵呵,
      

  6.   

    你要让空值排在最后,就需要在排序时加NULLS last