期望的产出:我想选择1991年薪水高于1991年平均水平的雇员的所有头衔。
当前代码:
USE employees;
SELECT t.title
FROM employees emps INNER JOIN
employees.salaries s
ON s.emp_no = emps.emp_no INNER JOIN
employees.titles t
ON t.emp_no = s.emp_no
WHERE s.from_date LIKE '1991%' AND s.salary >
雇员表:
CREATE TABLE employees (
emp_no INT NOT NULL,
birth_date DATE NOT NULL,
first_name VARCHAR(14) NOT NULL,
last_name VARCHAR(16) NOT NULL,
gender ENUM ('M','F') NOT NULL,
hire_date DATE NOT NULL,
PRIMARY KEY (emp_no)
薪水表:
CREATE TABLE salaries (
emp_no INT NOT NULL,
salary INT NOT NULL,
from_date DATE NOT NULL,
to_date DATE NOT NULL,
FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,
PRIMARY KEY (emp_no, from_date)
标题表:
CREATE TABLE titles (
emp_no INT NOT NULL,
title VARCHAR(50) NOT NULL,
from_date DATE NOT NULL,
to_date DATE,
FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,
PRIMARY KEY (emp_no,title, from_date)
必须使用salaries表中的from_date。
答案 0 :(得分:2)
首先,薪水表中有时间范围。一个人本可以在1991年全部工作,只赚一份薪水。例如,从1989年到2000年以相同薪水工作的人就是这种情况。但是一个人也可以在一年中的某个时间工作以一份薪水,而另一部分工作以另一份薪水(例如,7月加薪)。一个人可能是1991年12月1日开始的。或者是1991年1月15日退出的。您如何计算平均值?
假设您只计算1991年的所有薪水记录。 A人在一月工作了1000年,其余时间为3000年,B人全年工作了1000年,而C人仅在2000年6月工作,而在7月仅4000年工作。计算:(1000 + 3000 + 1000 + 3300 + 3700)/ 5 =2400。1991年工作的薪水高于2400的人是A和C。
select *
from titles
where emp_no in
(
select emp_no
from salaries
where from_date <= date '1991-12-31' and to_date >= date '1991-01-01'
and salary >
(
select avg(salary)
from salaries
where from_date <= date '1991-12-31' and to_date >= date '1991-01-01'
)
);
您可能也想将标题限制为1991。我不知道。也许您甚至希望他们匹配薪水高于平均水平的时间范围。在这种情况下,您将不得不寻找重叠的时间范围。 (示例1:6月的薪水上涨,7月的新职位将是两个薪水最高的职位。示例2:6月的新薪水,7月的薪水上涨将是一个薪水较高的职位。)
如果您拥有MySQL 8.0,则可以使用WITH
子句来选择1991年的薪水,以使查询更具可读性。
答案 1 :(得分:0)
avg_salary_in_1991
字段,以便进行比较。where
中放置一个条件,以便员工salary
应该大于计算出的avg_salary_in_1991
。尝试以下操作:
USE employees;
SELECT t.title
FROM employees AS emps
INNER JOIN employees.salaries AS s ON s.emp_no = emps.emp_no
INNER JOIN employees.titles AS t ON t.emp_no = s.emp_no
CROSS JOIN (SELECT AVG(s2.salary) AS avg_salary_in_1991
employees.salaries AS s2
WHERE YEAR(s2.from_date) = 1991) AS avg_sal_1991
WHERE YEAR(s.from_date) = 1991 AND
s.salary > avg_sal_1991.avg_salary_in_1991