Oracle PL / SQL分组问题

时间:2013-04-03 00:19:12

标签: oracle plsql oracle10g

我想为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

输出必须是这样的。

enter image description here

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我理解您提出的问题是参考使用GROUP BY,但我会仔细研究这个问题。

“编写SQL查询以检索获得该部门最高薪水的员工的部门名称,名字,姓氏,工资。”

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

您需要一个聚合函数才能使用GROUP BY。聚合函数是在多个记录上执行任务的函数。这些是SUM,AVG和COUNT等函数。如果您有一个聚合函数,则按照函数中没有的任何内容进行分组。

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

Here is a link for Aggregate Functions