Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL - Jak filtrować i wyświetlać maksymalną wartość z grupy?

Jednym z możliwych rozwiązań jest użycie HAVING i 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
)

jeśli ALL nie działa dla ciebie. Możesz to zmienić w ten sposób

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 i następna wersja, która unika skorelowanego podzapytania za 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
) 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz kopię zapasową bazy danych MySQL za pomocą CodeIgniter

  2. MySQL - Operand powinien zawierać 1 kolumnę (kolumny)

  3. MySql Inner Join z klauzulą ​​WHERE

  4. Zaznacz WSZYSTKIE pola zawierające tylko WIELKIE litery

  5. Jakiś powód klauzuli GROUP BY bez funkcji agregacji?