2015-09-18 49 views
-1

我有這些表:SQL - 選擇名稱和其員工的最大數量各部門的地址

部門

DEPARTMENT_ID DEPARTMENT_NAME  ADDRESS    
------------- -------------------- -------------------- 
     10 ACCOUNTING   NEW YORK    
     20 RESEARCH    DALLAS    
     30 SALES    CHICAGO    
     40 IT     DALLAS    
     50 EXECUTIVE   NEW YORK    
     60 MARKETING   CHICAGO  

員工

Employee_ID employee_name job      manager_ID hire_date salary commission department_ID 
------------------------------------------------------------------------------------------------------------ 
7839  KING   PRESIDENT       20-NOV-01 5000    50 
7596  JOST   VICE PRESIDENT   7839  04-MAY-01 4500    50 
7603  CLARK   VICE PRESIDENT   7839  12-JUN-01 4000    50 
7566  JONES   PUBLIC ACCOUNTANT  7596  05-APR-01 3000    10 
7886  STEEL   PUBLIC ACCOUNTANT  7566  08-MAR-03 2500    10 
7610  WILSON   ANALYST     7596  03-DEC-01 3000    20 
7999  WOLFE   ANALYST     7610  15-FEB-02 2500    20 
7944  LEE    ANALYST     7610  04-SEP-06 2400    20 
7900  FISHER   SALESMAN    7603  06-DEC-01 3000 500   30 
7921  JACKSON   SALESMAN    7900  25-FEB-05 2500 400   30 
7952  LANCASTER  SALESMAN    7900  06-DEC-06 2000 150   30 
7910  SMITH   DATABASE ADMINISTRATOR 7596  20-DEC-01 2900    40 
7788  SCOTT   PROGRAMMER    7910  15-JAN-03 2500    40 
7876  ADAMS   PROGRAMMER    7910  15-JAN-03 2000    40 
7934  MILLER   PROGRAMMER    7876  25-JAN-02 1000    40 
8000  BREWSTER  TBA         22-AUG-13 2500  

我需要顯示除達拉斯外的名稱和地址,擁有最多的員工人數。

我寫了這個:

SELECT department_name, address 
FROM department 
WHERE department_id IN 
       (SELECT MAX(department_id) 
        FROM  department 
        WHERE UPPER(address) != 'DALLAS') 
ORDER BY department_name; 

但我只得到一個行

DEPARTMENT_NAME  ADDRESS    
-------------------- -------------------- 
MARKETING   CHICAGO    

我在做什麼錯?

+0

首先,爲什麼你不能獲得單個記錄?你在期待什麼?其次,你爲什麼要做'MAX(department_id)'?你認爲那是什麼? – sstan

+0

所有你將會得到的是一行,因爲你說的部門ID匹配最大部門ID。所以,最高價值的部門ID。 您需要使用「有數」的組。 – CargoMeister

+0

我試過這個,但仍然無法讓它工作。我試過 GROUP BY department_id HAVING count(*)=(SELECT MAX(count(*)) FROM employee GROUP BY department_id) – user5352234

回答

0

根據您的樣本數據,該城市似乎記錄在department表的address列中,並且多個部門可以擁有相同的城市。

鑑於此,以及您想「排除達拉斯」的事實,如您所說,我會假設您想過濾掉所有相關的address列爲「達拉斯」的部門。

不過,我不知道......

  1. 你想在達拉斯,如果他們碰巧與其他部門(或多個)並列爲最高的員工排除部門或
  2. 如果在確定達到員工數量最多的部門時,您想排除達拉斯的部門。

如果(1)爲真:

select * 
    from department_tbl 
where department_id in (select department_id 
          from employee_tbl 
          group by department_id 
         having count(*) = (select max(num_emps) 
              from (select department_id, 
                  count(*) as num_emps 
                from employee_tbl 
                group by department_id))) 
    and address <> 'DALLAS'; 

如果(2)爲真:

select * 
    from department_tbl 
where department_id in (select department_id 
          from employee_tbl 
          group by department_id 
         having count(*) = (select max(num_emps) 
              from (select department_id, 
                  count(*) as num_emps 
                from employee_tbl 
                where address <> 'DALLAS' 
                group by department_id))); 
0

嘗試此。

SELECT d.department_name, 
     d.address 
FROM department d 
     JOIN employee e 
     ON (d.department_id = e.department_id) 
WHERE d.address <> 'DALLAS' 
GROUP BY d.department_name, 
      d.address 
HAVING Count(*) = (SELECT Max(cnt) 
        FROM (SELECT Count(*) CNT 
          FROM employee e 
          WHERE NOT EXISTS (SELECT 'x' 
               FROM department d 
               WHERE d.department_id = 
                e.department_id 
                AND d.address = 'DALLAS') 
          GROUP BY department_id)) 
+0

我在Brian DeMilia的回答中遇到的問題是,如果(1)如果達拉斯的僱員人數最多,那麼他的查詢將不會返回任何結果。我猜你不想那樣。 (2)儘管他解釋了爲什麼他以這種方式回答,但他並未排除達拉斯的最終結果。你可能也不想要那樣。我仍然猜測你想要什麼,但是我的查詢排除了達拉斯並返回了兩個結果。由於這看起來像一個家庭作業問題,我猜測你正在尋找什麼。 –

1

不知道我理解你的問題,但我認爲你想這樣的:

with emp_count as (
    select d.department_name, 
     d.address, 
     count(*) as num_emps, 
     max(count(*)) over() as max_count 
    from department d 
    join employee e on d.department_id = e.department_id 
    where address <> 'DALLAS' 
    group by d.department_name, d.address 
) 
select * 
from emp_count 
where num_emps = max_count; 

這將返回:

DEPARTMENT_NAME | ADDRESS | NUM_EMPS 
----------------+----------+--------- 
SALES   | CHICAGO |  3 
EXECUTIVE  | NEW YORK |  3 

SQLFiddle例如:http://sqlfiddle.com/#!4/05db83/1

0
select e.department_id, d.department_name, count(e.department_id) 
from employee e, department d 
where e.department_id = d.department_id 
group by e.department_id, d.department_name 
having count(e.department_id)=(select max(count(department_id)) 
           from employee 
           group by department_id); 

希望它有幫助

相關問題