2014-02-17 28 views
1

嗨我想要从下面的查询中得到前3名总和(薪金),没有重复。 我们不能使用rownum,因为它会给出重复。有人可以帮我吗?SQL查询 - 前3总和(sal)

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

http://www.techonthenet.com/oracle/questions/top_records.php – MatBailie

回答

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

+0

此查询不会工作 – Sai

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()函数我已经给despon命令deepno明智的薪水行号

例如:

dname sal rn 
..... ... ... 
acc 5000 1 
acc 3000 2 
acc 3000 2 
acc 2000 3 
bcc 4500 1 
bcc 3000 2 .....etc 
  • 外,我只是用不同的关键字
+0

一些解释将有助于未来的用户了解你的答案 – Machavity

+0

@Machavity解释加 – Sai

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 
0

在外部查询中也使用不同的函数来避免重复的总和。

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;