SQL - 计算最大员工数并使用子查询排除字符串

时间:2016-01-12 09:51:00

标签: sql oracle

这是我的两张桌子:

雇员

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    

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     

我需要使用子查询(而不是联接)来编写声明,以显示具有最大雇员人数的所有部门(不包括达拉斯的部门)的名称和地址。除了字符串'DALLAS'

之外,我不能有任何硬编码

结果应如下所示:

DEPARTMENT_NAME      ADDRESS            
-------------------- --------------------
EXECUTIVE            NEW YORK             
SALES                CHICAGO

我没有加入就这样做了。以下是我的三次尝试:

SELECT department_name, address
FROM   department
WHERE  department_id NOT IN 
                (SELECT     department_id 
             FROM       department
             WHERE  UPPER(address) + 'DALLAS')
ORDER BY department_name;

SELECT department_name, address
FROM department
WHERE  department_id NOT IN 
                (SELECT     department_id 
             FROM       department
             WHERE  UPPER(address) = 'DALLAS')
AND department_id > ALL
(select COUNT(department_id) FROM employee GROUP BY department_id)
ORDER BY department_id; 


select *
  from department
 where department_id in (select department_id
                           from employee
                          group by department_id
                         having count(*) = (select max(num)
                                             from (select     department_id,
                                                          count(*) as num
                                                     from employee_tbl
                                                    where address !=     'DALLAS'
                                                    group by     department_id)));

任何人都可以告诉我,如果我能够接近并指导我朝着正确的方向前进吗?感谢

2 个答案:

答案 0 :(得分:2)

拥有最多员工人数的部门(使用单个表扫描):

SELECT department_id
FROM   (
  SELECT department_id,
         RANK() OVER ( ORDER BY num_employees DESC ) AS rnk
  FROM   (
    SELECT department_id,
           COUNT(1) AS num_employees
    FROM   employees
    GROUP BY department_id
  )
)
WHERE  rnk = 1;

查找不在DALLAS中的部门:

SELECT department_id
FROM   departments
WHERE  address <> 'DALLAS'

结合两者:

SELECT department_id
FROM   (
  SELECT department_id,
         RANK() OVER ( ORDER BY num_employees DESC ) AS rnk
  FROM   (
    SELECT department_id,
           COUNT(1) AS num_employees
    FROM   employees
    WHERE  department_id IN (
      SELECT department_id
      FROM   departments
      WHERE  address <> 'DALLAS'
    )
    GROUP BY department_id
  )
)
WHERE  rnk = 1;

答案 1 :(得分:0)

也许是这样的?

select department_name, address
from department
where department_id in 
        (SELECT e.department_id
        FROM employee e
        group by e.department_id
        having count(*) = (
                           select max(count(e2.employee_id))
                           FROM employee e2
                           WHERE  department_id NOT IN (SELECT     department_id 
                                     FROM       department
                                     WHERE  UPPER(address) = 'DALLAS')
                           group by e2.department_id
                           )                   
       )
       and UPPER(address) != 'DALLAS'

但它不是飞机上最好的查询:)很奇怪

在你的查询中,艾伦我不明白表格中的位置

  

employee_tbl