2009-07-01 128 views
0

嗨,我需要一个小的帮助,写一个简单的查询。我想根据部门中员工的最大数量来显示结果。SQL子查询

这里是我的表

empid   dept   sal 
emp001   d001   10000 
emp002   d001   10000 
emp003   d002   20000 
emp004   d001   10000 
emp005   d003   5000 
emp006   d003   5000 

预期结果

empid   dept   sal 
emp001   d001   10000 
emp002   d001   10000 
emp004   d001   10000 
emp005   d003   5000 
emp006   d003   5000 
emp003   d002   20000 

所以DEPT1包含3名员工,所以应该是第一位的和dept3包含2名员工,因此将未来和这样一来就

在此先感谢,

Nagu

回答

1

只是在MySQL想这一点,并用此查询:

SELECT E1。 *,COUNT(e2.empid)为C FROM employees E1 LEFT JOIN 员工E2 ON e1.dept = e2.dept GROUP BY e1.empid ORDER用C DESC

我得到了这样的结果:

empid dept sal  c 
emp001 d001 10000 3 
emp004 d001 10000 3 
emp002 d001 10000 3 
emp006 d003 5000 2 
emp005 d003 5000 2 
emp003 d002 20000 1 

然后你当然可以排序上EMPID前emp004等:)

编辑得到emp002:一个更好的MySQL查询将与不选择*元素和逃避所有的表和字段名称与反引号,像这样:

选择`e1`.`empid`,`e1`.`dept`, `e1`.`sal`,COUNT(`e2`.`empid`)AS`C` FROM`雇员`e1`左加入 `雇员``e2` ON`e1`.`dept` = `e2`.`dept` GROUP BY`e1`.`empid` ORDER BY`c` DESC,`e1` .`empid`

+0

这只适用于MySQL,因为您在e1.empid上进行了分组,并选择了e1。* – Andomar 2009-07-01 09:37:50

-1

我不确定你想要什么,但是这个查询给你每个部门的雇员数量。

SELECT dept, COUNT(*) FROM table GROUP BY dept 

问候

+0

是的,但那不是他要求的。 – 2009-07-01 10:47:19

0

你可以通过计算在每加入部门员工人数,然后顺序:

select e.empid, e.dept e.sal 
from employees e 
inner join (
    select dept, total = count(*) 
    from employees 
    group by dept 
) headcount hc on hc.dept = e.dept 
order by hc.total desc, e.dept, e.sal 
0

我没有缴费就测试这个数据库,但尝试给这个旋转:

SELECT empid, dept, sal 
    FROM emp_table 
    JOIN 
    (SELECT COUNT(empid) [emp_count], dept 
    FROM emp_table 
    GROUP BY dept 
) count_table 
    ON emp_table.dept = count_table.dept 
    ORDER BY 
    emp_count DESC 
    , empid ASC 

3

答案几乎取决于你的DBMS! 借助Oracle 8+您可以使用分析功能:

select empid, dept, sal 
from MyTable 
order by count(empid) over (partition by dept) desc 
+1

+1不错的查询(也可以在Sql Server 2005+上运行) – Andomar 2009-07-01 09:38:54

0

答案几乎不取决于你的DBMS!借助Oracle 8+您可以使用分析功能:

同样的查询工作与SQL Server 2005+

还有另一种解决方案,让同样的结果几乎相同的执行计划:

;With DeptCount as 
(Select dept, count(empid) as cnt 
    from employees 
    group by dept 
) 
Select e.empid, e.dept e.sal 
    From employees e 
Inner Join DeptCount c 
     on e.dept=c.dept 
Order By c.cnt DESC, e.empid ASC 
0

没有CTE的版本:

Select e.empid, e.dept e.sal 
    From employees e 
Inner Join (Select dept, count(empid) as cnt 
       from employees 
       group by dept 
      ) c on e.dept=c.dept 
Order By c.cnt DESC, e.empid ASC