【问题标题】:Oracle 11g: Write a query that lists the highest earners for each departmentOracle 11g:编写一个查询,列出每个部门的最高收入者
【发布时间】:2015-04-13 00:28:23
【问题描述】:

这是一个我已经花了几个小时解决的问题,并尝试了各种不同的方法。 必须使用子查询

“编写一个查询,列出每个部门的最高收入者。包括每个员工的姓氏、部门 ID 和薪水。”

我已经完成了大量的子查询方法,但没有任何效果。我要么得到一个错误,要么“没有行返回”。我假设是因为其中一个 department_id 为空,但即使使用 NVL(department_id),我仍然遇到问题。我尝试拆分桌子,但没有运气。教科书没有帮助,我的导师有点没用,请......任何帮助。

如果有帮助,这里是值的快照。 https://www.dropbox.com/s/bxtntlzqixdizzp/helpme.png?dl=0

【问题讨论】:

  • 很遗憾它必须使用子查询,因为这不是编写查询的最佳方式。
  • 我同意,没有子查询有更好的方法来做到这一点。我一点也不喜欢这门课。我不介意 SQL,这只是这门课的教学方式(很差)。我认为甲骨文(甲骨文公司在学校街对面有一栋楼)向他们支付了使用他们的学习材料和测试的费用,这对于教你需要知道的东西并不是很有效。

标签: sql oracle oracle11g subquery


【解决方案1】:

您可以对每个部门内的值进行排名 - 然后仅拉取外部查询中的第一名。

select a.last_name
,a.department_id
,a.salary
from (
  select last_name
  ,department_id
  ,salary
  ,rank() over (partition by department_id order by salary desc) as rnk
  from tablename
) a
where rnk=1

分区将共享同一部门的所有员工组合在一起,并且无论空值如何都应该工作。

将它们分组后 - order by 告诉该组按薪水降序排序,并给出排名。您可以只运行内部查询来了解它的作用。

【讨论】:

  • 有没有办法在不显示排名的情况下做到这一点?
  • 在第一行 - 而不是让 [ select * from ( ] 再次定义列名......在你的情况下:select a.last_name, a.department_id, a.salary from (
  • 谢谢尼尔。如果我的老师不喜欢它,或者因为我在很长一段时间内没有做到这一点而试图给我打分,我只会向学校投诉他的课程。我真的不明白为什么会存在这样的问题......其他一切,我都没有问题,但在我屈服之前,我与这只野兽搏斗了两个多小时。
猜你喜欢
  • 2022-10-21
  • 1970-01-01
  • 2011-04-11
  • 2019-10-03
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多