2015-09-18 46 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); 

希望它有帮助

相关问题