1

因此,此语句适用于三个表。包含部门名称和部门 ID 的部门表,包含与项目相关的项目和员工 ID 的 workon 表,以及包含员工 ID、部门 ID 和名称的员工表。我试图找到从事项目工作的员工最多的部门。

这是我的代码:

select distinct 
    (dname) as "Division Name"
from 
    employee e, division d
where 
    d.did = e.did and 
    d.did in (
        select did from employee where empid in (
            select empid from workon having count(pid) >= all(pid)
        )
    )

我应该得到“人力资源”的答案,但无论我使用什么代码,我似乎都无法得到这个答案。

Workon table

PID EMPID   HOURS
3   1   30
2   3   40
5   4   30
6   6   60
4   3   70
2   4   45
5   3   90
3   3   100
6   8   30
4   4   30
5   8   30
6   7   30
6   9   40
5   9   50
4   6   45
2   7   30
2   8   30
2   9   30
1   9   30
1   8   30
1   7   30
1   5   30
1   6   30
2   6   30

Employee Table

EMPID   NAME    SALARY  DID
1   kevin   32000   2
2   joan    42000   1
3   brian   37000   3
4   larry   82000   5
5   harry   92000   4
6   peter   45000   2
7   peter   68000   3
8   smith   39000   4
9   chen    71000   1
10  kim 46000   5
11  smith   46000   1

Division
DID DNAME   MANAGERID
1   engineering 2
2   marketing   1
3   human resource  3
4   Research and development    5
5   accounting  4
4

1 回答 1

1

请检查此参考。

SQLFIDDLE

select d.id, d.name, p.maxcounts
from dept d, 
(select we.dep, max(we.counts) as maxcounts 
 from (select w.eid, count(w.pid) as counts, 
 e.dep as dep from employee e, workon w
where e.id = w.eid
group by e.dep) as we) as p
where d.id = p.dep
;

结果:

ID      NAME                MAXCOUNTS
111     human resoruces     5

以下是根据您自己的数据进行的编辑:

参考:SQLFIDDLE_Based_ON_OP_Data

您可以通过三种方式实现这一目标。要么使用嵌套选择,将 Max(count) 保存到变量中,要么按 desc 排序数据并将其限制为 1。

方法一:

-- 使用嵌套选择

--子查询 1向 OP 解释如何得出最终答案

select e.dep, count(w.eid) as num_emp
from employee e, workon w
where e.id = w.eid
group by e.dep
order by e.dep
;
-- **results of sub query 1:**

DEP     NUM_EMP
1           4
2           5
3           7
4           5
5           3

--最终的嵌套选择查询

select ee.dep, dd.name, count(ww.eid)
from employee ee, dept dd, workon ww
where ee.id = ww.eid
and ee.dep = dd.id
group by ee.dep, dd.name
having count(ww.eid) = 
(select distinct max(t.num_emp)
from (select e.dep, count(w.eid) as num_emp
from employee e, workon w
where e.id = w.eid
group by e.dep
order by e.dep)as t)
;

-- 使用嵌套选择的结果

DEP     NAME            COUNT(WW.EID)
3       human resource  7

-- 使用变量查询

select max(x.num_emp) into @myvar from 
(select e.dep, count(w.eid) as num_emp
from employee e, workon w
where e.id = w.eid
group by e.dep) as x
;


select x.dep, x.name, x.num_emp as num_emp from 
(select e.dep, d.name, count(w.pid) as num_emp
from employee e, workon w, dept d
where e.id = w.eid
and e.dep = d.id
group by e.dep) as x
where x.num_emp = @myvar
;

-- 使用变量的结果

DEP     NAME              NUM_EMP
3       human resource    7

-- 使用限制 1 和有序 desc 表查询

select e.dep, d.name, count(w.eid) as num_emp
from employee e, workon w, dept d
where e.id = w.eid
and e.dep = d.id
group by e.dep
order by num_emp desc 
limit 1

-- 使用 order by desc 和 limit 1 的结果:

DEP     NAME              NUM_EMP
3       human resource    7

现在,当使用方法 3 时,有时会有两个部门在项目中工作的员工人数最多,这对您来说可能或可能无关紧要。因此,在这种情况下,您可以使用嵌套方法或变量方法。

* PS 我没有全职在 StackOverFlow 上的特权,因此很抱歉迟到了 :) *

于 2012-11-29T04:11:15.160 回答