У меня есть таблица сотрудников , где у каждого сотрудника есть связанные дата_ начала , конец_даты и оклад .
* 1010.*
ПРИМЕЧАНИЕ: внизу вы можете найти код SQL для импорта структуры и данных.
+----+-------+------------+------------+---------+
| id | name | start_date | end_date | salary |
+----+-------+------------+------------+---------+
| 1 | Mark | 2017-05-01 | 2020-01-31 | 2000.00 |
| 2 | Tania | 2018-02-01 | 2019-08-31 | 5000.00 |
| 3 | Leo | 2018-02-01 | 2018-09-30 | 3000.00 |
| 4 | Elsa | 2018-12-01 | 2020-05-31 | 4000.00 |
+----+-------+------------+------------+---------+
Проблема
Для заданного диапазона дат я хочуизвлекать среднее значение заработной платы за каждый месяц в указанном диапазоне дат.
ОБНОВЛЕНИЕ: Я хотел бы иметь решение для MySQL 5.6, но было бы здорово иметь решение дляMySQL 8+ (только для личных знаний).
Пример
Если диапазон дат равен 2018-08-01 - 2019-01-31 , оператор SQL должен зацикливаться с августа 2018 года по январь 2019 года, и он должен рассчитывать среднюю зарплату за каждый месяц:
- в Август 2018 активные сотрудники Марк , Таня , Лев (потому что август 2018 года находится между стart_date и end_date ), поэтому среднее значение составляет 3333.33
- в сентября 2018 активные сотрудники Mark , Таня , Лев (поскольку сентябрь 2018 года находится между start_date и end_date ), поэтому среднее значение составляет 3333.33
- в Октябрь 2018 Активные сотрудники Марк , Таня , поэтому в среднем 3500.00
- в ноябре 2018 активные сотрудники: Марка , Таня , поэтому среднее значение составляет 3500.00
- в Декабрь 2018 Активные сотрудники: Марка , Таня , Эльза , поэтому в среднем 3666.6667
- в Январь 2019 Активные сотрудники Марка , Таня , Эльза так что в среднем 3666.6667
После вы можете увидеть ожидаемый результат для даты range 2018-08-01 - 2019-01-31
+------+-------+------------+
| year | month | avg_salary |
+------+-------+------------+
| 2018 | 08 | 3333.33 |
| 2018 | 09 | 3333.33 |
| 2018 | 10 | 3500.00 |
| 2018 | 11 | 3500.00 |
| 2018 | 12 | 3666.67 |
| 2019 | 01 | 3666.67 |
+------+-------+------------+
ПРИМЕЧАНИЕ: Я решил эту проблему, смешивая MySQL с PHP-кодом, но для большого диапазона дат он должен выполнять слишком много запросов (по одному в месяц).Поэтому я хотел бы иметь решение , использующее только MySQL .
SQL для импорта структуры и данных
CREATE TABLE `employees` (
`id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`start_date` date NOT NULL,
`end_date` date NOT NULL,
`salary` decimal(10,2) DEFAULT NULL
);
INSERT INTO `employees` (`id`, `name`, `start_date`, `end_date`, `salary`) VALUES
(1, 'Mark', '2017-05-01', '2020-01-31', '2000.00'),
(2, 'Tania', '2018-02-01', '2019-08-31', '5000.00'),
(3, 'Leo', '2018-02-01', '2018-09-30', '3000.00'),
(4, 'Elsa', '2018-12-01', '2020-05-31', '4000.00');