mysql - 如何找到复杂的SQL查询

标签 mysql sql-server database

我有一个这样的表:

表:员工

   EmpId:  INTEGER NOT NULL
   DeptId: INTEGER NOT NULL
   Name:   Char(40) NOT NULL
   Age:    INTEGER NOT NULL
   Salary: INTEGER NOT NULL

表:部门

   DeptId: INTEGER NOT NULL
   Name:   Char(40) NOT NULL
   Rank:   INTEGER NULL

我需要查找的查询是:-

a) 按照该部门所有员工平均年龄的递减顺序对所有部门进行排名,然后相应地更新排名列。因此,员工平均年龄最高的部门应排名为 1,员工平均年龄第二高的部门应排名为 2,依此类推。

如果多个部门的员工平均年龄相同,则应按唯一的 DeptId 进行排名,没有员工的部门的排名不应更新。

b) 列出部门名称以及部门总预算。总预算简单地定义为该部门员工的工资总和。如果该部门没有任何员工,则其总和应为 0。

c) SQL查询输出所有部门的名称,使得该部门的平均工资大于10,00,000

最佳答案

我已经创建了用于运行查询的临时表和数据

CREATE TABLE #Employee(
EmpId  INTEGER NOT NULL,
DeptId INTEGER NOT NULL,
Name   Char(40) NOT NULL,
Age    INTEGER NOT NULL,
Salary INTEGER NOT NULL
);

CREATE TABLE #Department(
DeptId INTEGER NOT NULL,
Name   Char(40) NOT NULL,
Rank   INTEGER NULL
);

INSERT INTO #Employee VALUES(1,1,'A',34,9000000),
                            (2,2,'B',25,450000),
                            (3,1,'C',45,600000),
                            (4,1,'D',23,340000),
                            (5,2,'E',21,580000),
                            (6,3,'F',26,7500000),
                            (7,1,'G',27,650000),
                            (8,2,'H',28,410000),
                            (9,1,'I',29,120000),
                            (10,2,'J',54,150000),
                            (11,3,'I',65,1500000);

INSERT INTO #Department (DeptId,Name) VALUES(1,'Dept 1'),
                                            (2,'Dept 2'),
                                            (3,'Dept 3');

以下是满足您要求的查询

一)

   UPDATE #Department SET RANK=a.Rank
   FROM (SELECT DeptId,AVG(Age) AS 'AvgAge',ROW_NUMBER() OVER (ORDER BY AVG(AGE)DESC,DeptId ASC) AS 'Rank' 
         FROM #Employee GROUP BY DeptId)a 
   WHERE #Department.DeptId=a.DeptId

b)

   SELECT d.Name,SUM(e.Salary) AS 'Total Budget' 
   FROM #Employee e JOIN #Department d 
   ON e.DeptId=d.DeptId 
   GROUP BY d.Name

c)

   SELECT d.Name,AVG(e.Salary) AS 'Avg Sal > 1000000' 
   FROM #Employee e JOIN #Department d 
   ON e.DeptId=d.DeptId
   GROUP BY d.Name HAVING AVG(e.Salary)>1000000

关于mysql - 如何找到复杂的SQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51454809/

相关文章:

Sql 列添加另一列

java - 在java sql准备语句中使用时间戳

mysql - 如何找到不同部门的第n个最高薪水?

mysql - C3P0 连接池与 MySQL 连接池

Python:使用请求读取图像(url),然后将其作为BLOB数据保存到MySQL

sql-server - 如何改进大表的读取操作?

MYSQL - 数据库备份每个事务

mysql - 是否有任何免费工具可以自动从现有的 html 表单创建数据库(首选 mysql)表?

java - 在多数据库、单 Berkeley DB JE 环境中删除数据库

MySQL:永久设置 sql_mode