2017-11-20 11 views
3

私はこれをしばらく解決しようとしています。ここで多くの興味深いものを見つけましたが、要求された方法で解決できませんでした。SQL - Getting MAX AVG

は、私は2つのテーブルを持っている:

PROFESSOR (ID, NAME, DEPARTMENT_ID and SALARY) and 
DEPARTMENT (ID, NAME). 

私は最高の平均給与を持っている部門名を表示するクエリを記述する必要があります。また、複数の部門が平均SALARYが最も高い場合は、すべての順序を任意の順序でリストする必要があります。

私はとても多くのことを試みましたが、最終的に私はモンスターを作りました。私はHAVINGを使ってみましたが、私のやり方ではうまくいきませんでした。道に迷いました。問題は、関数を集約するために使用する必要があることです。

SELECT b.nam, b.average 
FROM (SELECT DEPARTMENT.NAME AS nam, AVG(PROFESSOR.SALARY) AS average 
    FROM PROFESSOR JOIN DEPARTMENT ON (PROFESSOR.DEPARTMENT_ID = 
DEPARTMENT.ID) 
    GROUP BY DEPARTMENT.NAME) AS b 
GROUP BY b.nam, b.average 
ORDER BY b.average DESC 

しかし、このクエリでは、すべての部門が平均であり、最大ではありません。

誰かが私を助けて簡単な方法で説明できたら、本当に感謝します。 ありがとう!

答えて

2

これは使用できます。複数の行に同じ最大平均値がある場合は、WITH TIESを使用して、すべての値を表示できます。

SELECT TOP 1 WITH TIES DEPARTMENT.NAME AS nam, AVG(PROFESSOR.SALARY) AS average 
FROM PROFESSOR 
JOIN DEPARTMENT ON (PROFESSOR.DEPARTMENT_ID = DEPARTMENT.ID) 
GROUP BY DEPARTMENT.NAME 
ORDER BY AVG(PROFESSOR.SALARY) DESC 
2
;WITH x AS (

     SELECT t.dept, 
       T.avg_sal, 
       rank() OVER(ORDER BY t.avg_sal DESC) AS rnk 

     FROM 
      (
       SELECT d.name AS 'dept', 
         avg(p.salary) AS avg_sal 
       FROM department AS d 
        INNER JOIN 
        professor AS p ON p.department_id=d.id 
       GROUP BY d.name 
      ) AS t 
) 

-- all depts with highest avg sal 
SELECT dept, avg_sal 
FROM x 
WHERE rnk = 1 
1

あなたはMAX(avgSalary)副問合せすることができます。私がここでやったやり方は、CTEを使うことでした。

select 
    NAME, 
    max(avg_salary) as max_avg_salary 
from 
    DEPARTMENT d inner join 
    (select 
    DEPARTMENT_ID , 
    avg(SALARY) as avg_salary 
    from 
    PROFESSOR 
    group by 
    DEPARTMENT_ID) a on 
    d.DEPARTMENT_ID = a.DEPARTMENT_ID 

そこにあなたが他の回答に見るようにそれを行うための他の方法がありますが、私はあなたが両方を決定するためにgroup byを使用してできるだけ簡単な解決策をしたいと思う:私は何をしたいことはあると思い

WITH cte AS 
(
SELECT DEPARTMENT_ID 
     ,AVG(SALARY) [avgSalary] 
    FROM PROFESSOR 
GROUP BY DEPARTMENT_ID 
) 

SELECT D.[NAME] 
     ,cte.avgSalary 
    FROM cte INNER JOIN DEPARTMENT D 
      ON D.ID = cte.DEPARTMENT_ID  
WHERE cte.avgSalary = (SELECT MAX(avgSalary) 
          FROM cte) 
0

それぞれavgおよびmaxの全てavgsである。あなたが必要とするのはサブクエリだけです。これはあなたがよく知っているでしょう。

HTH