2013-12-15 9 views
5

Mam dwie tabele z następujących dziedzinSQL kwerenda wybierająca za pomocą łączy, grupa przez i funkcji agregujących

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

jestem zobowiązany napisać kwerendę, która daje dane pracownika, ile razy pracownik otrzymał podwyższenie wynagrodzeń, wartość maksymalnej kwoty zwiększenia i data tego zwiększenia. Oto, co mam do tej pory:

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; 

to poprawnie podaje wszystkie wymagania poza datą przyznania maksymalnego podwyższenia. Próbowałem następujących bez powodzenia:

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; 

powoduje to błąd "Nieprawidłowe użycie funkcji grupowej". Czy ktoś wie, co robię źle?

Odpowiedz

4

Nie możesz tego zrobić WHERE inc_amount=max(inc_amount) w klauzuli WHERE, użyj HAVING lub zrobić to w warunkach przyłączenia, spróbuj zamiast tego:

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;