SQL查询 - 前3个总和(sal)

时间:2014-02-17 14:19:59

标签: sql oracle oracle11g

您好我想要从下面的查询中获得前三个总和(工资)而不重复。 我们不能使用rownum,因为它会给重复。有人可以帮我吗?

SELECT d.dname, SUM(e.sal)
FROM emp e ,dept d
WHERE e.deptno = d.deptno
GROUP BY d.dname;

4 个答案:

答案 0 :(得分:1)

   select dname,sum(distinct sal) from 
   (SELECT d.dname dname, sal,
    dense_rank() over (partition by e.deptno order by sal desc) rn 
    FROM emp e,dept d WHERE e.deptno = d.deptno) where rn<=3 group by dname;
  • 在内部查询中我查询了dname,sal以及使用dense_rank()函数我已经按照顺序给了deptno明智的工资行号

例如:

dname  sal  rn
.....  ...  ...
acc    5000  1
acc    3000  2
acc    3000  2
acc    2000  3
bcc    4500  1
bcc    3000  2 .....etc
  • 在外部我只是使用不同的关键字
  • 过滤工资

答案 1 :(得分:0)

您可以尝试以下查询:

Select
  Agg_Sal.Dname, 
  Agg_Sal.Total_Sal,
  Rank() Over (Partition By Dname Order By Total_Sal Desc) Rank
From 
  (Select 
    D.Dname Dname, 
    Sum(Sal) As Total_Sal 
  From 
    Emp E, Dept D
  Where
    E.Deptno = D.Deptno
  Group By
    D.Dname) Agg_Sal
Where 
  Rank <= 3
Order By 
  Rank

类似于Here

上的最后一个例子

答案 2 :(得分:0)

如果按工资降序订购,则rownum应该有效:

select *
  from (select d.dname, sum(e.sal)
          from emp e, dept d
         where e.deptno = d.deptno
         group by d.dname
         order by 2 desc)
 where rownum <= 3

答案 3 :(得分:0)

在外部查询中也使用distinct函数以避免重复的总和。

    select distinct(a.sumsal),a.dname
        from (select d.dname, sum(e.sal)
                   from emp e, dept d
                   where e.deptno = d.deptno
                   group by d.dname
                   order by 2 desc) a
     where rownum <= 3;