SQL сравнивает значение со средним значением за определенный год - PullRequest
0 голосов
/ 03 октября 2018

Желаемый результат: я хочу выбрать все должности сотрудников, которые в 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)

Должна использоваться дата from_date в таблице зарплат.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Прежде всего, есть временной диапазон в таблице зарплат.Человек мог проработать весь 1991 год за одну зарплату.Это относится, например, к человеку, который работал с 1989 по 2000 год за ту же зарплату.Но человек может также проработать часть года за одну зарплату, а другую часть - за другую (например, повышение зарплаты в июле).И человек, возможно, начал работу 1 декабря 1991 года. Или уволился 15 января 1991 года. Как вы хотите рассчитать среднее значение?

Допустим, вы просто посчитали все записи о зарплатах в 1991 году. Например, человек А работалв январе на 1000 и на остальную часть года на 3000 человек B работал весь год на 1000, а человек C работал только в июне на 2000 и в июле на 4000. Расчет: (1000 + 3000 + 1000 + 3300 + 3700) /5 = 2400. Лица, работавшие в 1991 году с более высокой зарплатой, чем 2400, - это А и С.

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: повышение зарплаты в июне, новый заголовок в июле будет двумя заголовками для высокой зарплаты. Пример 2: новый заголовок в июне, повышение зарплаты в июле будет одним заголовком с высокой зарплатой.)

Если у вас MySQL 8.0, вы можете использовать предложение WITH, чтобы выбрать зарплату 1991 года, чтобы сделать запрос более читабельным.

0 голосов
/ 03 октября 2018
  • В производной таблице вычислите среднюю зарплату за 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...