2016-09-22 5 views
1

Es gibt viele Buchhalter und jeder von ihnen hat Jobs (stundenweise bezahlt) und ich muss den Buchhalter-Namen jedes Buchhalters, der eine durchschnittliche Jobkosten höher als der Gesamtdurchschnitt hat Jobkosten. Wie mache ich das?So erhalten Sie mehrere Durchschnittswerte mit Unterabfragen

SELECT Accountant_Name, AVG(job_cost) as 'Average' 
FROM job_view 
WHERE Average > (SELECT AVG (job_cost) AS AV 
FROM job_view) 
GROUP BY Accountant_Name; 

Alles, was benötigt wird, ist in einer Ansicht namens job_view. Der obige Code funktioniert nicht. Danke im Voraus.

+0

Was ist der Fehler, den Sie mit obigem Code bekommen sind? –

+0

Ungültiger Spaltenname 'Average' –

+0

Der 'Average'-ALIAS für die Spalte' AVG (Job_Cost) 'ist in der' WHERE'-Klausel nicht sichtbar. Deshalb könnten Sie versuchen, es durch 'AVG (Job_Cost)' zu ersetzen, aber dann werden Sie feststellen, dass gefensterte Funktionen nur in 'HAVING'- und' SELECT'-Teilen der Abfrage existieren können. Werfen Sie einen Blick auf meine Antwort, wie Sie all das lösen können. –

Antwort

1

Dies sollte es für Sie tun:

SELECT Accountant_Name 
    , AVG(Job_Cost) as 'Average' 
FROM Job_View 
GROUP BY Accountant_Name 
HAVING AVG(Job_Cost) > (SELECT AVG(Job_Cost) FROM Job_View) 

Wie pro Ihren Kommentar, der Fehler Sie bei WHERE Average > bekommen ist, weil der Alias ​​Average nicht sichtbar in einer WHERE Klausel ist und in der Regel erfordert, dass Sie die setzen gesamten Inhalt der Spalte, so wie Sie ihn im SELECT Teil definiert haben.

Aber weil im SELECT Teil der Average Spalte eine Aggregatfunktion ist, können diese nur geringer gehen im HAVING Abschnitt, weil HAVING Filterung von Aggregatzuständen behandelt.

Warum all das? Weil es Regeln für die Reihenfolge der Ausführung von Anweisungen in einer Abfrage gibt, z. B. explained here.

+0

Es funktionierte mit der GROUP BY-Klausel hinzugefügt, danke, aber ich habe das gleiche mit WHERE versucht statt HAVING dann gab es mir immer noch einen Fehler. Könntest du mir sagen, warum das so war? –

1

Sie werden immer noch müssen Gruppe von Accountant_Name

SELECT Accountant_Name, AVG(job_cost) as 'Average' 
    FROM job_view 
    GROUP BY Accountant_Name 
    Having AVG(job_cost) > (SELECT AVG (job_cost) FROM job_view); 
Verwandte Themen