【问题标题】:Finding all departments where the total salary is greater than the average of the total salary at all departments查找总工资大于所有部门总工资平均值的所有部门
【发布时间】:2016-07-07 15:36:24
【问题描述】:

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

我有五个表如下所示...

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 子句的等效查询是什么?

【问题讨论】:

    标签: sql database oracle11g relational-database


    【解决方案1】:

    使用 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
    

    【讨论】:

      【解决方案2】:

      我没有要测试的更改,但这样的东西应该可以工作。

      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
      )
      

      【讨论】:

      • 运行此查询后显示ERROR at line 8: ORA-00907: missing right parenthesis
      • 虽然我没有发现这里缺少任何括号。
      【解决方案3】:

      最后,我得到了正确的查询。所以,不使用 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;   
      

      【讨论】:

        猜你喜欢
        • 2021-09-09
        • 1970-01-01
        • 2011-04-28
        • 2022-11-10
        • 2023-03-22
        • 1970-01-01
        • 2019-01-25
        • 2020-08-09
        • 1970-01-01
        相关资源
        最近更新 更多