SQL将特定年份的值与平均值进行比较

时间:2018-10-03 18:18:31

标签: mysql sql

期望的产出:我想选择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。

2 个答案:

答案 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)

  • Derived Table中,计算1991年的平均薪水。您可以使用Year()函数确定给定MySQL日期的年。
  • Cross Join和派生表,以便每一行都有一个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