2013-12-09 74 views
1

我的表結構是這樣的(有多個值表中,但我只寫了有關這個的):選擇特定信息

Department(dep_id, dep_name) 
Employee(dep_id) 

我需要顯示dep_name和員工在每個數部門,除了一個特定的部門(我們稱之爲DepX)以及只有一個以上員工的部門。 我嘗試了多種方法來解決這個問題,但都沒有工作。 一些方法我試過:

SELECT department.dep_name, COUNT(employee.dep_id) AS NumberOfEmployees FROM employee 
INNER JOIN department ON employee.dep_id=department.dep_id 
WHERE dep_name<>'DepX' 
GROUP BY dep_id 
HAVING COUNT(employee.dep_id) > 1; 

SELECT dep_name FROM department 
WHERE dep_name <>'DepX' 
UNION 
SELECT COUNT(*) FROM employee 
WHERE COUNT(*) > 1 
GROUP BY dep_id; 

我不知道這一點。謝謝!

+0

你是什麼意思,「他們都不工作」?錯誤消息?沒有結果?錯誤的結果?請給出明確的例子;如您正在使用的數據,您期望的結果以及您實際得到的結果。 – MatBailie

+0

你的第一個方法有什麼問題,請你發佈錯誤信息! –

回答

1

第一個例子就現在的工作,因爲你包括在搜索結果中dep_name沒有聚集而不是分組就可以了你的表的別名。在子查詢

SELECT department.dep_name, COUNT(employee.dep_id) AS NumberOfEmployees FROM employee 
INNER JOIN department ON employee.dep_id=department.dep_id 
WHERE dep_name<>'DepX' 
GROUP BY department.dep_name 
HAVING COUNT(employee.dep_id) > 1; 

還是做COUNT

您可以在您的分組使用的部門名稱,而不是ID的

SELECT department.dep_name, 
     e.NumberOfEmployees 
FROM department 
INNER JOIN (SELECT dep_id, 
        COUNT(*) NumberOfEmployees 
      FROM employee 
      GROUP BY dept_id 
      HAVING COUNT(dept_id) > 1  
      ) e 
ON department.dep_id = e.dep_id 
WHERE dep_name<>'DepX' 
1
SELECT department.dep_name, COUNT(employee.dep_id) AS NumberOfEmployees FROM employee 
INNER JOIN department ON employee.dep_id=department.dep_id 
WHERE department.dep_name not in('DepX') 
GROUP BY department.dep_name 
HAVING COUNT(employee.dep_id) > 1; 

更新根據您的需要

+0

不會返回 消息8120,級別16,狀態1,行1 列'department.dep_name'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中嗎? –

+0

是的,你是對的,有更新答案。 –

0

進行測試。此查詢不僅幫助您返回dept_name,還可以返回部門中的所有字段(如果需要):

SELECT d.*, A.numOfEmployees 
FROM Department d, 
    (
    SELECT e.dep_id, COUNT(*) numOfEmployees 
    FROM Employee e 
    GROUP BY e.dep_id 
    HAVING COUNT(*) > 1 
    ) A 
WHERE d.dep_id = A.dep_id 
AND d.dep_name != 'DepX'