我有两个表(管理和员工)。
管理表跟踪过去几年管理公司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
答案 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;