我需要找到最大数量的不同员工 所以我的代码就像:
select ProjName from Project where ProjId in (
select ProjId from EmpProject
order by count(ProjId) desc
group by ProjId
where rownum<=1
);
但它抛出一个错误,说缺少右括号。 那么有人能告诉我如何解决这个问题吗?
答案 0 :(得分:1)
你的语法不正确。 order by
子句在结尾处,where
在group by
之前。所以你的查询变为:
SELECT ProjName
FROM Project
WHERE ProjId IN
(SELECT ProjId
FROM EmpProject
WHERE rownum<=1
GROUP BY ProjId
ORDER BY COUNT(ProjId) DESC
);
上面的内容可能不是你想要的,假设你想获得最大数量的顶级项目。
在11g或之前,您可以在子查询中使用排序,然后在外面应用rownum过滤器:
SELECT ProjName
FROM Project
WHERE ProjId IN
(SELECT ProjId
FROM
(SELECT ProjId FROM EmpProject GROUP BY ProjId ORDER BY COUNT(ProjId) DESC
)
WHERE rownum<=1
);
在12c及以上,您可以像这样使用FETCH FIRST
:
SELECT ProjName
FROM Project
WHERE ProjId IN
(SELECT ProjId FROM EmpProject GROUP BY ProjId ORDER BY COUNT(ProjId) DESC
FETCH FIRST 1 row only
);
答案 1 :(得分:1)
如果要查找分配给最多员工数量的项目,您还可以使用窗口功能和聚合的组合。自从Oracle 10(甚至可能是Oracle 9)以来,这将适用于任何事情
select p.projname
from project p
join (
select projid,
row_number() over (order by count(*) desc) as rn
from empproject
group by projid
) t on t.projid = p.projid and t.rn = 1
答案 2 :(得分:0)
您的要求只是说“最大数量的不同员工” - 它没有说明如何以最大员工数返回项目的projectID。这意味着查询应该只返回一个数字,没有别的。
假设您的EmpProject显示为哪个员工分配到哪个项目的empID和projID,并且还假设可能存在重复项(不清楚为什么会有,但是您要求DISTINCT员工好像可能存在重复项) - 您可以做这样的事情。使用SCOTT模式中的标准EMP表进行说明,因为您没有提供测试数据;用EmpProject和empID以及projID替换表名和列名,以便在表上使用它。
select max( count(distinct empno) ) as max_employees
from emp
group by deptno
;
MAX_EMPLOYEES
-------------
6