2011-10-21 21 views
1

我正在嘗試以下操作: 我有一個ename,job,deptno和sal表。我試圖發起一個查詢,返回每個部門的最高收入者。我通過分組和子查詢完成了這項工作。不過,我也想顯示deptno的平均值。所以下面的結果是:組合列

"ename" "dept" "sal" "average of dept" 
sal  20  1000 500 
kelly 30  2000 800 
mika  40  3000 400 

這可能是不可能的,因爲平均值不會與其他行關聯。

任何建議,將不勝感激。謝謝。我正在使用Oracle 10g來運行我的查詢。

回答

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 
+0

哇這是偉大的。這工作!即使我自己的SQL講師告訴我,查詢是不可能的。非常感謝。 – dcray89

0

不知道有關甲骨文公司的,也沒有在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) 
+0

非常感謝你的回答。由於某種原因,雖然查詢不起作用。我忘了提及所有數據只有一張表(emp)。 – dcray89

+1

@ user1006446他只從一個表中進行選擇。順便說一句,從來沒有說過「它不工作」。總是指定**它如何不工作 - 即是否有錯誤信息,或者查詢結果不正確等... –

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相同的最大值。如果您只希望每個部門有一個人,您可以用ROW_NUMBER()代替RANK()(在這種情況下,您還可以通過指定額外的排序標準選擇首選項進一步延伸ORDER BY,否則將從最高工資中隨機選取)。

+0

這工作得很好!非常感謝。 – dcray89