查找总薪资大于所有部门总薪资平均值的所有部门

时间:2016-03-21 08:02:46

标签: sql database oracle11g relational-database

我之前发现了类似的问题类型。但那些并不完美,我想要的。所以,我在这里问过。

我有五张桌子如下......

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

现在我发现所有部门的总薪水都高于总薪水的平均值 在使用此查询的所有部门。

with dept_total (dept_name, value) as
(select dept_name, sum(salary)
from instructor
group by dept_name),
dept_total_avg(value) as
(select avg(value)
from dept_total)
select dept_name
from dept_total, dept_total_avg
where dept_total.value >= dept_total_avg.value;

如果不使用提供相同结果的with子句,那么等效查询是什么?

3 个答案:

答案 0 :(得分:0)

使用HAVING子句将允许此操作,以下SQL未经测试但应该有效...

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

答案 1 :(得分:0)

我没有改变测试,但这样的事情应该有效。

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
)

答案 2 :(得分:0)

最后,我得到了正确的查询。因此,不使用with子句的等效查询就是这个。

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;