首页 > 试题广场 >

计算组内平均值II

[编程题]计算组内平均值II
  • 热度指数:36 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

表: 薪水表

+------+-----+
| 字段名称 | 类型  |
+------+-----+
| 雇员编号 | int |
| 部门编号 | int |
| 薪水   | int |
+------+-----+

雇员编号 是该表的主键。
该表的每一行表示 一个部门中一名雇员的薪水信息,包含雇员编号、部门编号和薪水。

 

编写一个 SQL 查询,保持行数不变,得出每个部门的平均薪水,平均薪水保留2位小数。

查询结果如下例所示。

 

示例 1:

输入: 表:薪水表
+-------+------+-------+
| 雇员编号  | 部门编号 | 薪水    |
+-------+------+-------+
| 10001 | 1    | 60117 |
| 10002 | 2    | 92102 |
| 10003 | 2    | 86074 |
| 10004 | 1    | 66596 |
| 10005 | 1    | 66961 |
| 10006 | 2    | 81046 |
| 10007 | 2    | 94333 |
| 10008 | 1    | 75286 |
| 10009 | 2    | 85994 |
| 10010 | 1    | 76884 |
+-------+------+-------+ 输出: +-------+------+-------+-----------+
| 雇员编号  | 部门编号 | 薪水    | 平均薪水      |
+-------+------+-------+-----------+
| 10001 | 1    | 60117 | 69168.80  |
| 10004 | 1    | 66596 | 69168.80  |
| 10005 | 1    | 66961 | 69168.80  |
| 10008 | 1    | 75286 | 69168.80  |
| 10010 | 1    | 76884 | 69168.80  |
| 10002 | 2    | 92102 | 87909.80  |
| 10003 | 2    | 86074 | 87909.80  |
| 10006 | 2    | 81046 | 87909.80  |
| 10007 | 2    | 94333 | 87909.80  |
| 10009 | 2    | 85994 | 87909.80  |
+-------+------+-------+-----------+ 解释: 因为求每个部门的平均薪水时必须保持行数不变,因此需要使用窗口函数进行求值,语法为:avg(薪水) over(partition by 部门编号),使用round()函数保留2位小数。
示例1

输入

CREATE TABLE `薪水表` 
(
    `雇员编号` INT,
    `部门编号` INT,
    `薪水` INT
);
-- 插入第一组数据
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10001, 1, 60117);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10002, 2, 92102);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10003, 2, 86074);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10004, 1, 66596);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10005, 1, 66961);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10006, 2, 81046);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10007, 2, 94333);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10008, 1, 75286);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10009, 2, 85994);
INSERT INTO `薪水表` (`雇员编号`, `部门编号`, `薪水`) VALUES (10010, 1, 76884);

输出

雇员编号|部门编号|薪水|平均薪水
10001|1|60117|69168.8000
10004|1|66596|69168.8000
10005|1|66961|69168.8000
10008|1|75286|69168.8000
10010|1|76884|69168.8000
10002|2|92102|87909.8000
10003|2|86074|87909.8000
10006|2|81046|87909.8000
10007|2|94333|87909.8000
10009|2|85994|87909.8000
头像 牛客987852806号
发表于 2024-07-03 14:21:24
此题与上题差不多。 select 雇员编号,部门编号,薪水, avg(薪水)over(partition by 部门编号) as 平均薪水 from 薪水表