2016-11-21 2 views
1

Ich habe eine Datentabelle Mitarbeiter. Ich möchte die Mitarbeiter zeigen, die mehr als das Durchschnittsgehalt aller Mitarbeiter in der Mitarbeiterrunde verdienen. Der Code, den ich geschrieben habe, so weit ist:Gruppe von Fehlern in verschachtelter Funktion

select employee_id, last_name, salary 
from employees 
group by employee_id 
having salary > (select avg(sum(salary)) 
       from employees); 

Allerdings, wenn ich dies ausführen, eine „verschachtelte Funktion ohne Gruppe“ Fehler aufgetreten ist. Wie behebe ich das?

+0

Wollen Sie nicht nur die AVG? keine Notwendigkeit für die Summe? Ist nicht die Summe aller Mitarbeitergehälter geteilt durch die Anzahl? also warum summieren? Die Mathematik ergibt keinen Sinn und der Compiler fordert Sie auf, besser zu definieren, wonach Sie suchen. vielleicht meinst du: 'haben gehalt> (wählen avg (gehalt) von mitarbeitern);' und keine notwendigkeit für die äußere gruppe von, wenn sie dies tun. – xQbert

Antwort

2

GROUP BY überflüssig. Die äußere Gruppe von ist keine Aggregation. Gruppieren nach wird nur benötigt, wenn eine Aggregatfunktion verwendet wird. Da keine Aggregatfunktion, keine Gruppe durch!

Doppel Aggregation (avg(sum(salary)) in Unterabfrage nicht erforderlich Avg, an und für sich, eine durchschnittliche zurück. Nicht sicher, was die Summe zu tun versuchte. Wenn Sie die Summe durchrechnen, erhalten Sie die Summe. (Angenommen, ich habe 1,2,3,4,5: die Summe ist 15, der Mittelwert der Summe ist 15. Der Mittelwert ist jedoch 3.)

Und mit GROUP BY wird HAVING zu einem WHERE.

SELECT employee_id, last_name, salary 
FROM employees 
WHERE salary > (SELECT avg(salary) 
       FROM employees); 
+0

Danke xQbert! Was für ein dummer Fehler ich gemacht habe; vergessen, dass nur Avg genug ist. – Tim

+0

Wir alle brauchen manchmal einen zweiten Satz Augen. (Ich brauche normalerweise auch 2 1/2 weitere Gehirne; 1 & 1/2, um die Fehler, die ich mache, auszugleichen) – xQbert

Verwandte Themen