2016-03-21 3 views
0

Ich habe ähnliche Arten von Fragen zuvor gefragt.Aber die sind nicht perfekt, was ich will.So, ich muss gefragt Hier.Finden Sie alle Abteilungen, in denen das Gesamtgehalt höher ist als der Durchschnitt des Gesamtgehalts in allen Abteilungen

Ich habe fünf Tabellen unten angegeben ...

department(dept_name,building,budget); 
primary key (dept_name) 

course(course_id,title,dept_name,credits); 
primary key (course_id), 
foreign key (dept_name) references department 

instructor(id,name,dept_name,salary); 
primary key (ID), 
foreign key (dept_name) references department 

section(course_id,sec_id,semester,year,building,room_number,time_slot_id); 
primary key (course_id, sec_id, semester, year), 
foreign key (course_id) references course 

teaches(id,course_id,sec_id,semester,year); 
primary key (ID, course_id, sec_id, semester, year), 
foreign key (course_id, sec_id, semester, year) references section, 
foreign key (ID) references instructor 

Jetzt habe ich alle Abteilungen bin zu finden, wo der Gesamtgehalt größer ist als der Durchschnitt des Gesamtgehalt in allen Abteilungen diese Abfrage verwenden.

Was wird die äquivalente Abfrage sein, ohne die With-Klausel zu verwenden, die das gleiche Ergebnis liefert?

Antwort

0

die HAVING-Klausel verwendet, wird dies ermöglichen, wird die folgende SQL ist nicht getestet, sollte aber funktionieren ...

SELECT d.dept_name, 
    SUM(salary) AS DeptTotalSalary, 
    SUM(salary)/COUNT(*) AS DeptAverageSalary 
FROM department d 
JOIN instructor i ON i.dept_name d.dept_name 
GROUP BY d.dept_name 
HAVING DeptAverageSalary > DeptTotalSalary 
0

Ich hatte keine Änderung zu testen, aber so etwas wie dies funktionieren soll.

SELECT dept_name FROM instructor 
GROUP BY dept_name 
HAVING SUM(salary)>= 
(SELECT AVG(dept_sum.SumSalary) AS AvgSalary FROM 
    (
     SELECT dept_name, sum(salary) as SumSalary FROM instructor 
     GROUP BY dept_name 
    ) as dept_sum 
) 
+0

es sagt, 'FEHLER in Zeile 8: ORA-00907: fehlende rechte parenthesis' nach dieser Abfrage ausgeführt wird. –

+0

Obwohl ich hier keine Klammer fehlt. –

0

Schließlich habe ich die richtige Abfrage.So, die äquivalente Abfrage ohne die With-Klausel wird dies sein.

select dept_name 
from (
    select dept_name, sum(salary) dept_total 
    from instructor 
    group by dept_name 
), (
    select avg(dept_total) dept_total_avg 
    from (
     select dept_name, sum(salary) dept_total 
     from instructor 
     group by dept_name 
    ) 
) where dept_total >= dept_total_avg; 
Verwandte Themen