【问题标题】:SQL MAX((SUM)) combined usageSQL MAX((SUM)) 组合使用
【发布时间】:2021-12-19 19:36:14
【问题描述】:

我有两张桌子:

EMPLOYEE: ID|DEPARTMENT_ID|CHIEF_ID|NAME|SALARY

DEPARTMENT: ID|NAME

这里的任务是获取所有员工最高工资总额的部门列表。

我正在尝试使用的查询(完成但没有结果):

SELECT s.DEPARTMENT_ID, s.SALARY_SUM
 
FROM (SELECT DEPARTMENT_ID, SUM(SALARY) SALARY_SUM, w.ID
 
      FROM EMPLOYEE e
 
      JOIN DEPARTMENT w ON  w.ID = e.DEPARTMENT_ID 

      GROUP BY e.DEPARTMENT_ID, w.ID) s

WHERE s.SALARY_SUM = (SELECT MAX(SALARY) MaxSum

                    FROM EMPLOYEE w1 

                    WHERE  w1.ID = s.ID)

【问题讨论】:

  • 你用的是mysql 8吗?否则你需要两次选择子句
  • @nbk 抱歉,标签错误。我正在使用 MS SQL Server 15.0.2080.9

标签: sql sum max sql-server-2019


【解决方案1】:

这将为您提供所有员工总和最高的 Deoatnent

CREATE tABLe EMPLOYEE(DEPARTMENT_ID INT, SALARY INT)
GO
CREATE TABLe DEPARTMENT(ID int)
GO
WITH CTE as (SELECT DEPARTMENT_ID, SUM(SALARY) SALARY_SUM, w.ID
 
      FROM EMPLOYEE e
 
      JOIN DEPARTMENT w ON  w.ID = e.DEPARTMENT_ID 

      GROUP BY e.DEPARTMENT_ID, w.ID)
     
SELECT s.DEPARTMENT_ID, s.SALARY_SUM
 
FROM CTE s

WHERE s.SALARY_SUM = (SELECT MAX(SALARY_SUM) MaxSum

                    FROM CTE w1 )
GO
DEPARTMENT_ID | SALARY_SUM ------------: | ---------:

db小提琴here

【讨论】:

  • 非常感谢您的帮助!我得到的是一个部门而不是一个列表,但我想这应该是这样的。
  • 那么你的部门有不同的总和,你可以通过只运行 cte 中的部分来检查,但这会给出正确的结果don't forget to accept
【解决方案2】:

这里基本上有 4 个数据集。

  1. 员工电子
  2. 部门 w
  3. 子查询1秒
  4. 子查询 2(where 子句)

数据集 3 具有按部门 ID 聚合的薪水。 数据集 4 每个部门的员工工资最高。

Where 子句表示将 3 与 4 进行比较,其中 SALARY_SUM = MaxSum。因为 SALARY_SUM 是按部门 ID 聚合的,而 MaxSum 是最大的个人工资,所以这个 where 子句将只返回有 1 人的部门的结果(或者如果人们的工资为 0 美元)。

如果一个部门有多人带薪,则该部门的薪水之和永远大于部门内最大的个人薪水。

【讨论】:

  • 感谢您的澄清。无论如何,我不太明白如何修改查询以获得正确的结果。
  • 数据集 3 (subquery1 s) 应将其返回为(部门、该部门的总工资、部门 ID)。此聚合不需要 MAX。如果我想要每个部门的最高薪水,我会使用 MAX,如果我想要每个部门的总薪水,我会使用 SUM。
  • 谢谢你,安德鲁!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2011-01-05
  • 2018-07-16
  • 2023-03-11
  • 2018-06-05
  • 2014-05-06
  • 2020-09-29
相关资源
最近更新 更多