SQL select query using joins, group by and aggregate functions

30,247

You can't do this WHERE inc_amount=max(inc_amount) in the where clause, either use HAVING or do it in the condition of join, try this instead:

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;
Share:
30,247
StickyCube
Author by

StickyCube

Updated on October 16, 2020

Comments

  • StickyCube
    StickyCube over 3 years

    I have two tables with the following fields

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

    I am required to write a query which gives the employee details, the number of times an employee has received a salary increase, the value of the maximum increase amount and the date of that increase. Here is what i have so far:

    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;
    

    this correctly gives all the requirements apart from the date on which the maximum increase was awarded. I have tried the following with no success:

    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;
    

    this gives an error 'Invalid use of group function'. Does anyone know what i'm doing wrong?