----汗
--4. 找出销售总额最高的职员的姓名
select ename from (
select tbemp.ename, sum(tbsales.pamount) from tbemp
inner join tbsales on tbemp.eid=tbsales.eid
group by tbemp.ename
order by sum(tbsales.pamount) desc
)
where rownum = 1;

解决方案 »

  1.   

    和我下午一模一样的代码,这样的话有BUG,再插一条销售总额一样的职员,结果用rownum只能查询出一条。在大量的数据中销售总额一样的成千上百怎么办呢?
      

  2.   

    ---一次性说清楚,谢谢!
    select * from (
    select tbemp.ename, sum(tbsales.pamount),rank()over(order by sum(tbsales.pamount) desc ) as rank_num from tbemp
    inner join tbsales on tbemp.eid=tbsales.eid
    group by tbemp.ename)
    where rank_num = 1
      

  3.   

    非分析函数的写法,性能应该要打折扣的
    select tbemp.ename, sum(tbsales.pamount)  from tbemp
    inner join tbsales on tbemp.eid=tbsales.eid
    group by tbemp.ename
    having sum(tbsales.pamount) = (
      select max(pamount) from 
         (select tbemp.ename, sum(tbsales.pamount) as pamount  from tbemp
            inner join tbsales on tbemp.eid=tbsales.eid
          group by tbemp.ename
          )
     )
      

  4.   

    和rowmun没区别,,我在插一条数据进去,名叫张三,销售总额也为183000
    这时排序后的最高销售总额的有2名了,这样他的rank_num=2,where rank_num=1
    查询出的还是林雪一个人,题目是最高要一起查询出来。
      

  5.   

    请问你测试过没有?
    另外,我已经告诉你 rank 这个分析函数了,请你百度下它的含义,再提出问题
    oracle在排序方面有3个分析函数 rank,dense_rank,row_number,请你去看看再说select tbemp.ename, sum(tbsales.pamount),rank()over(order by sum(tbsales.pamount) desc ) as rank_num
    ,dense_rank()over(order by sum(tbsales.pamount) desc )
    ,row_number()over(order by sum(tbsales.pamount) desc )
     from tbemp
    inner join tbsales on tbemp.eid=tbsales.eid
    group by tbemp.ename
      

  6.   


    学习了但是有个问题想问一下
    SQL> SELECT DENSE_RANK() OVER(PARTITION BY EID ORDER BY SUM(PAMOUNT)) NUM FROM TBSALES;
    SELECT DENSE_RANK() OVER(PARTITION BY EID ORDER BY SUM(PAMOUNT)) NUM FROM TBSALES
                                          *
    行1でエラーが発生しました。:
    ORA-00937: 単一グループのグループ関数ではありません。
    为什么OVER里面不能分组了呢??
      

  7.   

    貌似是SELECT中使用聚合函数且有其他字段的时候,EG:SELECT EID,SUM(PAMOUNT) FROM TBSALES;
    就会报上面的错误,需要对投影中的非聚合函数的字段分组,EG:SELECT EID,SUM(PAMOUNT) FROM TBSALES GROUP BY EID;
    真纠结,PARTITION BY EID 会产生4条记录,ORDER BY SUM(PAMOUNT)产生一条记录,所以汇报错了。
    是这样理解的吧?
      

  8.   

    这3个函数直接的区别是什么?主要表现在出现相同排序的问题处理上。
    dense_rank() over()我叫他密集函数,当出现相同数据时,会默认相同数据有一样的编号,且接下来的编号不会跳跃
    rank() over()函数,当出现相同数据时,会默认相同数据有一样的编号,且接下来的编号会跳跃
    row_number() over()函数,仅对数据进行编号,而不考虑数据是否相同