SQL查询问题(可能的加入/子查询?)

时间:2009-03-30 22:40:29

标签: sql oracle join subquery ora-00937

我有两个表(管理员工)。

管理表跟踪过去几年管理公司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查询来获取管理员资格,其中雇用的员工人数最多。 我尝试过使用:

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

但我一直在接受:

  ORA-00937: not a single-group group function 

(我正在使用Oracle)

经过几个小时的Google-fu,我终于明白了这个错误意味着什么,但是我仍然想不出任何其他方式来形成这个查询。我尝试过使用子查询/连接,但仍然没有。我对SQL很新。如果有人可以提供帮助,我将非常感激!

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

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

从此查询中获取第一行:

select hireteam,count(*) from EMPLOYEE group by hireteam order by count(*) desc

答案 2 :(得分: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

你正在进入前N个查询的模糊区域,我将引导你进入这个excellent column of Ask Tom on Top-N。其他答案在简单的情况下工作,但是当你开始想要做一些事情,比如返回前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');

答案 3 :(得分: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

添加额外的having子句并放弃加入(因为我刚刚认出的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

如果多个管理层雇佣了相同数量的员工,这实际上可能会返回多行。它很丑陋......但是我知道在单个查询中没有更好的方法。

答案 4 :(得分:0)

如果您想将结果限制为单个记录,即使是最大数量的雇员关系:

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

要检索拥有最多雇员(包括领带)的所有hireteam值:

select * from (
    select hireteam,
           count(hireteam) count,
           rank() over (order by count(hireteam) desc) rank
    from   employee
    group by hireteam)
where rank = 1;