【发布时间】:2019-06-23 15:01:19
【问题描述】:
我有 employees 表,其中每个员工都有一个相关的 start_date、end_date 和 salary。
注意:在底部您可以找到用于导入结构和数据的 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 年 8 月到 2019 年 1 月循环,它必须计算每个月的平均工资:
- 在 2018 年 8 月,在职员工是 Mark、Tania、Leo(因为 2018 年 8 月在他们的start_date 和 end_date) 所以平均值是 3333.33
- 在 2018 年 9 月,在职员工是 Mark、Tania、Leo(因为 2018 年 9 月是他们的start_date 和 end_date) 所以平均值是 3333.33
- 2018 年 10 月活跃员工为 Mark、Tania,因此平均值为 3500.00
- 2018 年 11 月活跃员工为 Mark、Tania,因此平均值为 3500.00
- 在 2018 年 12 月,在职员工是 Mark、Tania、Elsa,因此平均值为 3666.6667
- 2019 年 1 月活跃员工为 Mark、Tania、Elsa,因此平均值为 3666.6667
您可以看到以下日期范围的预期结果 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');
【问题讨论】:
-
你可能应该提到哪个版本,因为这种事情在8.0+中被大大简化了
-
感谢您指出。我希望有 MySQL 5.6 的解决方案,但如果仅出于个人知识,也有适用于 8+ 的解决方案将是完美的。
标签: mysql sql date group-by aggregate-functions