期望产出:我想挑选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)
必须使用工资表中的起始日期。
2条答案
按热度按时间ctrmrzij1#
首先,工资表中有时间范围。一个人可以为了一份薪水工作了整个1991年。例如,一个从1989年到2000年以同样的薪水工作的人就是这样。但是,一个人也可以为一份薪水工作一年的一部分,为另一份薪水工作另一部分(例如7月份加薪)。一个人可能从1991年12月1日开始。或者在1991年1月15日辞职。你想怎样计算平均数?
假设你简单地计算了1991年的所有工资记录。e、 g.a人在1月份工作1000年,其余时间工作3000年,b人全年工作1000年,c人只在6月份工作2000年,7月份工作4000年。计算:(1000+3000+1000+3300+3700)/5=2400。1991年工资高于2400英镑的人是a和c。
你也可以把标题限制在1991年。我不知道。也许你甚至想让他们与薪水高于平均水平的时间跨度相匹配。在这种情况下,你必须寻找重叠的时间范围(例1:6月加薪,7月新职称将为高薪两个职称。例2:6月新职称,7月加薪将是一个高薪职称。)
如果你有mysql 8.0,你可以使用
WITH
子句来选择查询以使查询更具可读性。icnyk63a2#
在导出的表格中,计算1991年的平均工资。可以使用year()函数从给定的mysql日期确定年份。
与派生表交叉连接,以便每一行都得到一个
avg_salary_in_1991
字段,允许比较。提出条件
where
,以便salary
应大于计算的avg_salary_in_1991
.请尝试以下操作: