1

我有两张表(ManagementEmployee)。

管理表跟踪过去几年管理 X 公司的不同管理团队。每个管理团队都有一个ID(即:managementnr),每个团队都有一个CEO(即ceoname)。

员工表跟踪为 X 公司工作的员工(基本上只是他们的姓名和哪个管理团队雇用了他们)

这是SQL代码:


CREATE TABLE EMPLOYEE(
    EMPLOYEENAME   VARCHAR2(15) NOT NULL,
    HIRETEAM NUMBER(2), 
    PRIMARY KEY (EMPLOYEENAME)
    );

CREATE TABLE MANAGEMENT(
    MANAGEMENTNR NUMBER(2) NOT NULL,
    CEONAME VARCHAR2(20) NOT NULL,
    PRIMARY KEY (MANAGEMENTNR,CEONAME)
    );  

我正在尝试形成一个 SQL 查询来获取雇用最多员工的 managementNR。我试过使用:

SELECT HIRETEAM,max(count(HIRETEAM)) 
 from EMPLOYEE 
group by HIRETEAM

但我不断得到:

  ORA-00937: not a single-group group function 

(我正在使用甲骨文)

经过几个小时的 Google-fu,我终于明白了这个错误的含义,但是我仍然想不出任何其他方式来形成这个查询。我试过使用子查询/连接,但仍然没有。一般来说,我对 SQL 很陌生。如果有人可以提供帮助,我将不胜感激!

感谢您的宝贵时间 =]
--Evan Lestrange

4

5 回答 5

3

我想你正在寻找这个:

WITH counts_hireteam as (
   SELECT HIRETEAM
        , count(*) count_hireteam
     from EMPLOYEE 
   group by HIRETEAM
   order by count(*) desc
) 
select HIRETEAM  
  from counts_hireteam
 where rownum = 1;
于 2009-03-30T23:03:24.000 回答
2

这样做的“正确”方法实际上是这样的:

SELECT m.ceoname, COUNT(1), ROW_NUMBER() OVER (ORDER BY COUNT(1) DESC)
FROM management m
JOIN employee e ON m.managementnr = e.hireteam
GROUP BY m.ceoname

您正在进入 Top-N 查询的模糊区域,我将引导您到Top-N 上 Ask Tom 的这一优秀专栏。其他答案在简单的情况下有效,但是当您开始想要做一些事情时,例如返回前 3 名管理团队(按人数计算)并始终如一地这样做,您就会遇到问题。

一致性是一个关键点。正如汤姆所说:

查询中的 GROUP BY 子句是否保证输出数据将按 GROUP BY 列排序,即使没有 ORDER BY 子句?

除非并且直到查询中有 ORDER BY 语句,否则不能假定返回的行是按任何顺序排列的。如果没有 ORDER BY,数据可能会以数据库感觉返回的任何顺序返回。这一直是真的,而且永远都是真的。

事实上,在 Oracle 数据库 10g 第 2 版中,您会看到 GROUP BY 以随机顺序返回数据的频率比以前要高得多:

使用此示例数据:

INSERT INTO employee VALUES ('Bob',1);
INSERT INTO employee VALUES ('Sue',1);
INSERT INTO employee VALUES ('John',1);
INSERT INTO employee VALUES ('James',2);
INSERT INTO employee VALUES ('Mary',2);
INSERT INTO employee VALUES ('Ron', 2);
INSERT INTO employee VALUES ('Jane',3);
INSERT INTO employee VALUES ('Luke',4);
INSERT INTO employee VALUES ('Rob',4);
INSERT INTO employee VALUES ('Tim', 5);

INSERT INTO management VALUES (1, 'Kate');
INSERT INTO management VALUES (2, 'Larry');
INSERT INTO management VALUES (3, 'Jake');
INSERT INTO management VALUES (4, 'Sarah');
INSERT INTO management VALUES (5, 'Tom');
于 2009-03-30T23:04:04.733 回答
2

从此查询中获取第一行:

select hireteam,count(*) from EMPLOYEE group by hireteam order by count(*) desc
于 2009-03-30T22:46:23.807 回答
0

如果您想将结果限制为单个记录,即使在雇佣人数最多的情况下:

select * from (
    select hireteam, count(hireteam) count
    from employee
    group by hireteam
    order by count(hireteam) desc, hireteam asc )
where rownum = 1

要检索所有雇佣人数最多的雇佣团队值(包括关系):

select * from (
    select hireteam,
           count(hireteam) count,
           rank() over (order by count(hireteam) desc) rank
    from   employee
    group by hireteam)
where rank = 1;
于 2009-03-30T23:22:19.043 回答
0

这样,您就可以让所有团队拥有雇佣员工的数量。

select
    Management.ManagementNr,
    Management.CeoName,
    count(Employee.EmployeeName)   
from 
    Employee 
inner join 
    Management on Employee.HireTeam = Management.ManagementNr   
group by 
    Management.ManagementNr   
order by 
    count(Employee.EmployeeName) desc

添加一个额外的有子句并放弃加入(因为我刚刚认识到 CEO 的名字不是必需的),你会得到你想要的结果,如下所示。

select Employee.HireTeam   
from Employee   
group by Employee.HireTeam   
having count(EmployeeName) = select max(GroupSize)
   from select count(EmployeeName) as GroupSize
      from Employee group by Employee.HireTeam

如果多个管理层雇用了相同数量的员工,这实际上可能会返回多行。而且它很丑……但是我不知道在单个查询中做这件事的更好方法。

于 2009-03-30T22:46:31.063 回答