正如其他人已经解释的那样,“你不能吃蛋糕和吃它”。 您可以 某些内容分组,然后可以按原样返回它,也可以汇总一些内容。在您的情况下,您想按商店分组,即每个商店有一个单独的结果行(与内部联接条件匹配),而不是按员工。在这种情况下,必须汇总员工数据,其中包括姓名。 经典汇总会使用组中的所有条目,因此您将使用汇总中的所有员工姓名,这不是您想要的,因为您只想要薪水最高的员工。
幸运的是Oracle数据库确实有这样的情况下,一些(尽管可能不是全部),那就是KEEP
聚集函数调节剂,其DENSE_RANK
和LAST
/FIRST
。 这种结构允许对组中行的子集执行聚合,您KEEP
在聚合中所处的位置FIRST
或LAST
在指定的排名中(基于给定的排序标准)。在您的情况下,您需要根据薪水标准对组内的雇员(商店的雇员)进行排序,这样,汇总将仅限于薪水最高的雇员。假设,即工资是唯一的值(他们通常不是),这会给你一个子组的一个员工,这样你就可以申请任何你想要的聚合(经常MAX
或MIN
),并且仍然获得该名称。如果我们假设工资值不是唯一的,那么最高薪水可能不止一个员工- 首先是平局。在那种情况下,您可以在排名顺序中引入平局决胜方案(例如,薪水之后的次要条件可以是职位名称),也可以在汇总级别解决该问题(例如,通过选择MAX
或MIN
员工姓名)。
总而言之,我们得到的是这样的:
SELECT MAX(e.ename)
KEEP (DENSE_RANK FIRST ORDER BY e.sal DESC NULLS LAST, e.job) AS name,
MIN(e.job)
KEEP (DENSE_RANK FIRST ORDER BY e.sal DESC NULLS LAST, e.job) AS job,
e.store_id,
MAX(e.sal) AS salary,
s.city
FROM employees e
INNER JOIN stores s ON e.store_id = s.store_id
GROUP BY e.store_id, s.sity