Oracle SQL查询:为员工获得最大的销售额

时间:2009-09-28 12:33:11

标签: sql oracle plsql

我想为每位员工找到最大的销售(并显示员工的姓名)。在MySQL中,它非常简单:

select * 
  from employee, sale 
  where employee.id = sale.employee_id 
  group by employee_id 
  order by sale.total desc

这几乎与人们所期望的一样,它会返回一份员工名单,最终会返回最大的销售记录和员工行。

但是,当使用group by子句时,Oracle不允许您返回不按表达式分组的列。这样做可以让我在MySQL中做的“不可能”在Oracle中吗?或者有一些解决方法吗?我想我可以执行某种子查询,但不确定是否有另一种方法可以做到这一点,构建起来并不是那么复杂。

4 个答案:

答案 0 :(得分:4)

要获得最大的销售,您可以使用max功能分组。

select e.name, max (s.total) 
  from employee e, sale s 
  where e.id = s.employee_id 
  group by e.name 
  order by s.total desc
  • 我假设员工姓名位于name表的employee列中。我还将员工表和销售表别名。
  • 如果您希望查看员工的总销售额,可以换出max()并改为使用sum()

答案 1 :(得分:4)

删除select *并将其替换为您需要的列,然后按所有“未处理”列进行分组。

你最终会得到类似的东西:

select employee.id, employee.name, max(sale.total)
from employee, sale
where employee.id = sale.employee_id
group by employee.id, employee.name
order by max(sale.total) desc

这很痛苦 - 我以前必须多次这样做 - 但只需将所有相关列添加到您的小组

答案 2 :(得分:3)

恭喜你,你已经学到了足够的危险!

您真正想要的是每位员工最大的销售。现在碰巧按销售额desc对它们进行排序,然后将它们分组在MySQL中工作,即使根据ANSI SQL不合法。 (基本上,MySQL会随意抓取每个员工的第一行,并且因为排序而“有效”。)

这样做的正确方法不是依赖于你想要的那种效果的一面;相反,你应该明确地询问你想要什么:每个员工的最大销售额。在SQL中:

select employee.id, max( sale.total) 
from employee, sale 
where employee.id = sale.employee_id 
group by employee.id 
order by 2

答案 3 :(得分:1)

如果您想选择销售额最高的员工,则根本不需要GROUP BY

您只需选择最高销售额并将其加入employees

SELECT  *
FROM    (
        SELECT  sale.*, ROW_NUMBER() OVER (ORDER BY total DESC) AS rn
        FROM    sale
        ) s
JOIN    employee e
ON      e.id = s.employee_id
        AND s.rn = 1

这将选择总排名最高的单行。

如果您想选择每个员工的最高销售额,只需在查询中添加PARTITION BY子句:

SELECT  *
FROM    (
        SELECT  sale.*, ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY total DESC) AS rn
        FROM    sale
        ) s
JOIN    employee e
ON      e.id = s.employee_id
        AND s.rn = 1