2009-07-01 104 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