您好我想要从下面的查询中获得前三个总和(工资)而不重复。 我们不能使用rownum,因为它会给重复。有人可以帮我吗?
SELECT d.dname, SUM(e.sal)
FROM emp e ,dept d
WHERE e.deptno = d.deptno
GROUP BY d.dname;
答案 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 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;