我正在尝试执行以下操作: 我有一张ename,job,deptno和sal的桌子。我正在尝试启动一个返回每个部门的最高收入者的查询。我用分组和子查询完成了这个。但是,我也希望通过deptno显示平均sal。所以结果如下:
"ename" "dept" "sal" "average of dept"
sal 20 1000 500
kelly 30 2000 800
mika 40 3000 400
这可能是不可能的,因为平均值不与其他行相关联。
任何建议将不胜感激。谢谢。我使用Oracle 10g来运行我的查询。
答案 0 :(得分:2)
您可以使用analytic functions:
WITH RankedAndAveraged AS (
SELECT
ename,
dept,
sal,
RANK() OVER (PARTITION BY dept ORDER BY sal DESC) AS rnk,
AVG(sal) OVER (PARTITION BY dept) AS "average of dept"
FROM atable
)
SELECT
ename,
dept,
sal,
"average of dept"
FROM RankedAndAveraged
WHERE rnk = 1
如果所有员工的最大值均为sal
,则每个部门可能会返回多个员工。如果您只需要每个部门一个人,则可以将RANK()
替换为ROW_NUMBER()
(在这种情况下,您还可以通过指定其他排序条件来选择顶部项目来进一步扩展ORDER BY
,否则它将会从薪水最高的人中随机挑选。
答案 1 :(得分:1)
这应该有效。唯一的诀窍是,如果你有一个部门的最高工资的几个雇员,它将显示所有这些。
SELECT t.ename, t.deptno, mx.sal as sal, mx.avg_sal as avg_sal
FROM tbl t,
(SELECT MAX(sal) AS sal, AVG(sal) AS avg_sal, deptno
FROM tbl
GROUP BY deptno) mx
WHERE t.deptno = mx.deptno AND t.sal = mx.sal
答案 2 :(得分:0)
不确定Oracle,在大约10年内没有使用它,但是这样的事情应该是可能的:
SELECT
ename, deptno, sal,
(SELECT AVG(T2.sal)
FROM tbl T2
WHERE T2.deptno = T.deptno
) AS average_of_dept
FROM tbl T
GROUP BY deptno
HAVING sal = MAX(sal)