Oracle PL/SQL按问题分组

Oracle PL/SQL按问题分组,oracle,plsql,oracle10g,Oracle,Plsql,Oracle10g,我想为Oracle 10g Express做此练习 编写SQL查询以检索部门名称firstname, 姓氏,为该员工赚取最高工资的员工的工资 部门。” 我试过这个代码,但它对我不起作用 有两个名为employees和departments的表 错误为:ORA-00979:不是GROUP BY表达式 SELECT first_name, last_name, departments.department_name, salary FROM employees, departments where

我想为Oracle 10g Express做此练习

编写SQL查询以检索部门名称firstname, 姓氏,为该员工赚取最高工资的员工的工资 部门。”

我试过这个代码,但它对我不起作用

有两个名为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
输出必须是这样的


我知道您所问的问题是关于使用GROUP BY的,但我会仔细看看这个问题

编写SQL查询以检索为该部门赚取最高工资的员工的部门名称、姓氏、姓氏和工资

我认为你也会受益于看最大的功能,因为你正在寻找最高工资的员工

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

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


您需要使用聚合函数来获得结果。在这种情况下,您将使用
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)

对这就是答案,特别是最后一个解决方案对我来说非常清楚,谢谢