表: 薪水表 +------+-----+ 字段名称 类型 +------+-----+ 雇员编号 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
加载中...