MySQL - 如何过滤和显示组中的最大值?

时间:2017-11-28 20:58:47

标签: mysql sql

我创建了以下查询,该查询将为我提供数据库中所有商店的销售数据:

SELECT s.shopname AS "Store",
       e.empname AS "Employee",
       e1.empname AS "Manager",
       SUM(p.amount) AS "Total Sales"
FROM fss_Shop s
       JOIN fss_Employee e ON e.shopid = s.shopid
       JOIN fss_Payment p ON p.empnin = e.empnin
       JOIN fss_Employee e1 ON e1.empnin = e.mgrnin
GROUP BY e.empname, e.shopid

查询执行并返回数据。它应该给我每个商店的顶级销售人员,以及从查询中可以看到的其他数据。

我遇到的问题是,对于某些商店,它会返回多个员工,其中“总销售额”明显不同。例如,对于商店A,它将返回John(销售价值= 1000英镑)以及Martin(销售价值= 2000英镑)。我希望它只返回销售额最高的员工。

如何更改查询以便返回每个商店只有最高销售价值的员工?

以下链接可让您了解表格的外观: https://www.db-fiddle.com/f/t94XmTEMgXpmSLS3e8HWAh/1

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是使用HAVINGALL

SELECT s.shopname AS "Store",
   e.empname AS "Employee",
   e1.empname AS "Manager",
   SUM(p.amount) AS "Total Sales"
FROM fss_Shop s
   JOIN fss_Employee e ON e.shopid = s.shopid
   JOIN fss_Payment p ON p.empnin = e.empnin
   JOIN fss_Employee e1 ON e1.empnin = e.mgrnin
GROUP BY e.empname, s.shopid
HAVING SUM(p.amount) >= ALL(
   SELECT SUM(p.amount)
   FROM fss_Employee e
   JOIN fss_Payment p ON p.empnin = e.empnin
   WHERE e.shopid = s.shopid
   GROUP BY e.empname
)

如果ALL不适合您。你可以像这样改变它

SELECT s.shopname AS "Store",
   e.empname AS "Employee",
   e1.empname AS "Manager",
   SUM(p.amount) AS "Total Sales"
FROM fss_Shop s
   JOIN fss_Employee e ON e.shopid = s.shopid
   JOIN fss_Payment p ON p.empnin = e.empnin
   JOIN fss_Employee e1 ON e1.empnin = e.mgrnin
GROUP BY e.empname, e.shopid
HAVING SUM(p.amount) = (
   SELECT MAX(t.samount)
   FROM
   (
     SELECT SUM(p.amount) samount
     FROM fss_Employee emp
     JOIN fss_Payment p ON p.empnin = emp.empnin
     WHERE emp.shopid = e.shopid
     GROUP BY emp.empname
   ) t
)

确定以及避免FROM

后面的相关子查询的下一个版本
SELECT s.shopname AS "Store",
   e.empname AS "Employee",
   e1.empname AS "Manager",
   SUM(p.amount) AS "Total Sales"
FROM fss_Shop s
   JOIN fss_Employee e ON e.shopid = s.shopid
   JOIN fss_Payment p ON p.empnin = e.empnin
   JOIN fss_Employee e1 ON e1.empnin = e.mgrnin
GROUP BY e.empnin, e.shopid
HAVING (e.shopid, SUM(p.amount)) IN
(
  SELECT t.shopid, MAX(t.samount)
  FROM 
  (
     SELECT emp.shopid, SUM(p.amount) samount
     FROM fss_Employee emp
     JOIN fss_Payment p ON p.empnin = emp.empnin
     GROUP BY emp.empname, emp.shopid
  ) t
  GROUP BY t.shopid
)