代码之家  ›  专栏  ›  技术社区  ›  cgp

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

  •  3
  • cgp  · 技术社区  · 15 年前

    我想为每个员工找到最大的销售额(并显示员工的姓名)。在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 回复  |  直到 15 年前
        1
  •  4
  •   Brandon Belvin    15 年前

    摆脱你 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
  •  4
  •   akf    15 年前

    要获得最大的销售额,您可以使用Group By 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() 相反。
        3
  •  3
  •   tpdi    15 年前

    恭喜你,你已经学会了危险!

    你真正想要的是每个员工最大的销售额。现在,按照销售额DESC对它们进行排序,然后在MySQL中对它们进行分组,尽管根据ANSISQL这是不合法的。(基本上,MySQL是为每个员工任意获取第一行的,这是因为这类工作是可行的。)

    这样做的正确方法不是依赖于做你想做的事情的副作用;相反,你应该明确地问你想要什么:每个员工的最大销售额。在SQL中:

    select employee.id, max( sale.total) 
    from employee, sale 
    where employee.id = sale.employee_id 
    group by employee.id 
    order by 2
    
        4
  •  1
  •   Quassnoi    15 年前

    如果您想选择销售额最高的员工,您不需要 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