I have two complicated queries which I need to do an inner join between and I can't get the format correct.
The first query looks into the table that lists the manager of each department. As the table keeps a history of every change, I wanted to keep only the manager for each department with the latest from_date.
The department manager table looks like:
SELECT a.*
FROM
(SELECT d1.emp_no , d1.dept_no
FROM dept_manager d1
JOIN
(SELECT dept_no, MAX(from_date) AS Lastdate
FROM dept_manager
GROUP BY dept_no) d2 ON d1.from_date = d2.Lastdate
AND d1.dept_no = d2.dept_no) AS a;
Table looks like this:
Emp_no | dept_no | from_date | to_date |
---|---|---|---|
110022 | d001 | 1985-01-01 | 1991-10-01 |
110039 | d001 | 1991-10-01 | 9999-01-01 |
110085 | d002 | 1984-01-01 | 1989-12-17 |
110114 | d002 | 1989-12-17 | 9999-01-01 |
etc..
The second query is for the salaries of employees. As this table also keeps the salary history of each employee, I need to use (keep) only the most recent salary for any employee. The code I did was as follows:
SELECT b.*
FROM
(SELECT s1.emp_no , s1.salary
FROM salaries s1
JOIN
(SELECT MAX(from_date) AS Lastdate , emp_no
FROM salaries
GROUP BY emp_no) s2 ON s1.from_date = s2.Lastdate
AND s1.emp_no = s2.emp_no) AS b;
The table looks like:
Emp_no | salary | from_date | to_date |
---|---|---|---|
110001 | 45200 | 1991-01-01 | 1992-10-01 |
110001 | 47850 | 1992-01-01 | 1993-10-01 |
110001 | 52000 | 1993-10-01 | 1994-01-01 |
110022 | 35000 | 1985-01-01 | 1988-10-01 |
110022 | 36750 | 1988-01-01 | 1991-10-01 |
110022 | 38000 | 1991-10-01 | 1994-01-01 |
etc..
My objective is to get the average salary of all managers i.e. an inner join of the two complex queries shown above (the manager table and the salary table ).
What is the correct syntax for this?