2013-12-15 3 views
5

Ich habe zwei Tabellen mit den folgenden FeldernSQL-Select-Abfrage mit Joins Gruppe und Aggregatfunktionen

emp_table: emp_id, emp_name 
salary_increase: emp_id, inc_date, inc_amount 

ich verpflichtet bin, eine Abfrage zu schreiben, die die Mitarbeiterdaten, die Anzahl der Male geben Mitarbeiter erhalten haben eine Gehaltserhöhung, der Wert der maximalen Erhöhung und das Datum dieser Erhöhung. Hier ist, was ich bisher:

SELECT e.*, count(i.inc_amount), max(i.inc_amount) 
FROM salary_increase AS i 
RIGHT JOIN emp_table AS e 
ON i.emp_id=e.emp_id 
GROUP BY e.emp_id; 

dies korrekt alle Voraussetzungen abgesehen von dem Zeitpunkt gibt, an dem die maximale Erhöhung ausgezeichnet wurde. Ich habe Folgendes ohne Erfolg versucht:

SELECT e.*, count(i.inc_amount), max(inc_amount), t.inc_date 
FROM salary_increase AS i 
RIGHT JOIN emp_table AS e 
ON i.emp_id=e.emp_id 
RIGHT JOIN 
    (
    SELECT emp_id, inc_date FROM salary_increase 
    WHERE inc_amount=max(inc_amount) GROUP BY emp_id 
    ) AS t 
ON e.emp_id=t.emp_id 
GROUP BY e.emp_id; 

dies gibt einen Fehler "Ungültige Verwendung der Gruppenfunktion". Weiß jemand, was ich falsch mache?

Antwort

4

Sie können nicht das tun WHERE inc_amount=max(inc_amount) in der where-Klausel, verwenden Sie entweder HAVING oder tun es in den Zustand kommen, versuchen Sie stattdessen:

SELECT 
    e.emp_id, 
    e.inc_date, 
    t.TotalInc, 
    t.MaxIncAmount 
FROM salary_increase AS i 
INNER JOIN emp_table AS e ON i.emp_id=e.emp_id 
INNER JOIN 
(
    SELECT 
    emp_id, 
    MAX(inc_amount)  AS MaxIncAmount, 
    COUNT(i.inc_amount) AS TotalInc 
    FROM salary_increase 
    GROUP BY emp_id 
) AS t ON e.emp_id = t.emp_id AND e.inc_amount = t.MaxIncAmount;