2013-12-15 6 views
5

Ho due tabelle con i seguenti campiSQL query di selezione utilizzando join, gruppo da e funzioni di aggregazione

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

sono tenuto a scrivere una query che fornisce i dettagli dei dipendenti, il numero di volte in cui un dipendente ha ricevuto un aumento di stipendio, il valore dell'importo massimo di aumento e la data di tale aumento. Ecco quello che ho finora:

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; 

dà questo modo corretto tutti i requisiti a parte la data in cui è stato assegnato l'aumento massimo. Ho provato quanto segue senza successo:

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; 

questo dà un errore 'Uso non valido della funzione di gruppo'. Qualcuno sa cosa sto sbagliando?

risposta

4

Non si può fare questo WHERE inc_amount=max(inc_amount) nella clausola in cui, utilizzare HAVING o farlo nella condizione di join, provate questo invece:

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;