简体   繁体   中英

SQL - counting max number of employees and excluding string using subqueries

These are my two tables:

employee

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

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     

I need to write a statement using subqueries (not joins) to display the name and address of all departments (excluding departments in Dallas) having the maximum number of employees. I cannot have any hard coding except the string 'DALLAS'

The result should look like this:

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

I'm at a loss on doing this without joins. Here are my three tries:

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)));

Can anyone PLEASE tell me if I'm even getting close and guide me in the right direction? Thanks

The departments with the maximum number of employees (using a single table scan):

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;

Finding the departments not in DALLAS :

SELECT department_id
FROM   departments
WHERE  address <> 'DALLAS'

So combining the two:

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;

maybe something like this?

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'

but it is not the best query in plane :) very strange

In your query Ellen I did not understand where from the table

employee_tbl

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM