1

我想为 Oracle 10g Express 做这个练习

“编写一个 SQL 查询来检索该部门获得最高薪水的员工的部门名称、名字、姓氏、薪水。”

我尝试了这段代码,但它对我不起作用。

有两个表名为employees,departments

错误是:ORA-00979:不是 GROUP BY 表达式

SELECT first_name, last_name, departments.department_name, salary
FROM employees, departments

where employees.department_id = departments.department_id

group by salary

输出一定是这样的。

在此处输入图像描述

4

2 回答 2

2

您将需要使用聚合函数来获取结果。在这种情况下,您将使用max()获得每个部门的最高薪水。

有几种写法。

您可以在连接中使用子查询:

select d.department_name,
  e.first_name,
  e.last_name,
  e.salary
from employees e
inner join
(
  select max(salary) MaxSalary, department_id
  from employees
  group by department_id
) e1
  on e.department_id = e1.department_id
  and e.salary = e1.maxsalary
inner join departments d
  on e.department_id = d.department_id;

由于您使用的是 Oracle,因此可以使用窗口函数来获得结果:

select department_name, first_name, last_name, salary
from 
(
  select d.department_name,
    e.first_name,
    e.last_name,
    e.salary,
    row_number() over(partition by d.department_id order by e.salary desc) rn
  from employees e
  inner join departments d
    on e.department_id = d.department_id
) d
where rn = 1

或者您甚至可以使用WHERE子句来过滤数据:

select d.department_name,
  e.first_name,
  e.last_name,
  e.salary
from employees e
inner join departments d
  on e.department_id = d.department_id
where salary in (select max(salary)
                 from employees e1
                 where e.department_id = e1.department_id
                 group by department_id)
于 2013-04-03T01:14:10.450 回答
0

我了解您提出的问题是关于使用 GROUP BY 的,但我会仔细研究这个问题。

“编写一个 SQL 查询来检索该部门获得最高薪水的员工的部门名称、名字、姓氏、薪水。”

我认为您也将从查看最大值函数中受益,因为您正在寻找具有最高薪水的员工。

您需要一个聚合函数才能使用 GROUP BY。聚合函数是对多个记录执行任务的函数。这些是 SUM、AVG 和 COUNT 等函数。当你有一个聚合函数时,你可以按函数中没有的内容进行分组。

在您的示例中,MAX 将是您的聚合函数,您可以成功使用您的 GROUP BY。

这是聚合函数的链接

于 2013-04-03T00:48:28.773 回答