2017-10-28 127 views
0

找出第二最没有。的员工使用emp和dept表中的dname。为以下情况编写一个sql查询?

select d.dname,count(*) "totemp" from emp e,dept d 
where e.deptno=d.deptno 
group by (d.dname) 
having count(*)=(select max(count(*)) from emp e,dept d 
where e.deptno=d.deptno 
group by d.dname); 

此查询将显示最高号码。的员工使用dname。 但我想要dname的第二高。

回答

0

首先使用分组对每个部门的员工进行计数,然后使用dense_rank()窗口函数为部门组分配等级值,最后选择排名第二的部门。

select dname 
from (
    select dname, dense_rank() over (order by cnt desc) as rnk 
    from (
    select d.dname, count(*) as cnt 
    from emp e 
    join dept d using (deptno) 
    group by d.dname 
) t 
) x 
where rnk = 2 

使用dense_rank()功能您解决关系正确,因此,如果有一个以上的科指南与相同数量的员工,他们都将弹出。

可以使用row_number()功能挑即使有在第二位置关系任意改变部门的解决方案。

+0

但这里只DNAME显示,但我想总没有DNAME。员工 –

+0

增加了'cnt'列,它就在那里。 –

+0

YAA感谢...... –