组合列

时间:2011-10-21 04:48:48

标签: sql oracle oracle10g

我正在尝试执行以下操作:  我有一张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来运行我的查询。

3 个答案:

答案 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)