2017-11-20 4 views
3

So habe ich versucht, dies für eine Weile zu lösen, und obwohl ich viele interessante Dinge hier gefunden habe, konnte ich es einfach nicht so lösen, wie es angefordert wurde.SQL - Getting MAX AVG

Ich habe zwei Tabellen:

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

Ich habe eine Abfrage zu schreiben, die die Abteilungsnamen zeigen, dass das höchste durchschnittliche Gehalt hat. Auch wenn mehr als eine Abteilung den höchsten durchschnittlichen GEHALT hat, sollte sie dann alle in beliebiger Reihenfolge auflisten.

Ich habe so viele Dinge ausprobiert und am Ende habe ich ein Monster erschaffen, denke ich. Ich habe versucht mit HAVING, aber es hat nicht so funktioniert wie ich. Ich bin verloren. Das Problem ist, dass ich Funktionen aggregieren muss.

Aber diese Abfrage bringt mir alle Abteilungen mit dem Durchschnitt, nicht das Maximum.

Wenn jemand mir bitte helfen und erklären könnte, würde ich es sehr schätzen. Danke!

Antwort

2

Sie können dies verwenden. Wenn mehr als eine Zeile den gleichen maximalen Durchschnittswert hat, können Sie mit der Verwendung von WITH TIES alle davon mitbringen.

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

können Sie für die MAX(avgSalary) Unterabfrage. Die Art, wie ich es hier gemacht habe, war ein CTE zu verwenden.

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

Ich denke, was Sie wollen, ist:

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 

gibt es andere Möglichkeiten, es zu tun, wie Sie in den anderen Antworten zu sehen, aber ich glaube, Sie die einfachste Lösung wollen group by möglich mit beiden bestimmen jede avg und die max von allen avg s. Eine andere Sache, die Sie brauchen, ist eine Unterabfrage, mit der Sie wahrscheinlich vertraut sind.

HTH

Verwandte Themen