我想为每位员工找到最大的销售(并显示员工的姓名)。在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中吗?或者有一些解决方法吗?我想我可以执行某种子查询,但不确定是否有另一种方法可以做到这一点,构建起来并不是那么复杂。
答案 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