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

pkbketx9  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(273)

期望产出:我想挑选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)

必须使用工资表中的起始日期。

ctrmrzij

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。

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 子句来选择查询以使查询更具可读性。

icnyk63a

icnyk63a2#

在导出的表格中,计算1991年的平均工资。可以使用year()函数从给定的mysql日期确定年份。
与派生表交叉连接,以便每一行都得到一个 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

相关问题