Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL - Wie kann man den Maximalwert einer Gruppe filtern und anzeigen?

Eine mögliche Lösung ist die Verwendung von HAVING und 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, 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
)

wenn ALL funktioniert bei dir nicht. Sie können es wie folgt ändern

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
)

ok und die nächste Version, die korrelierte Unterabfragen hinter FROM vermeidet

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
)