假设表salaries包含employee_iddepartment_idsalary,如下所示.

e_id | dpt_id | salary
---- | ------ | ------
   1 |      2 |   1000
   2 |      2 |   2000
   3 |      5 |   3000
   4 |      6 |    500
   5 |      5 |    100
   6 |      1 |   1050

我想带来具有最高/最低工资的DPT,我使用了以下查询,但查询失败:

select sum_sal_per_dpt.dpt_id, max(sum_sal_per_dpt.total_salaries)
from (
      select dpt_id, sum(salary) as total_salaries
      from salaries
      group by dpt_id ) as sum_sal_per_dpt
group by sum_sal_per_dpt.dpt_id
union
select sum_sal_per_dpt.dpt_id, min(sum_sal_per_dpt.total_salaries)
from (
      select dpt_id, sum(salary) as total_salaries
      from salaries
      group by dpt_id ) as sum_sal_per_dpt
group by sum_sal_per_dpt.dpt_id

我得到的输出是一个带有dpt_id和工资总和的表,好像只执行子查询:

dpt_id | salary
------ | ------
     2 |   3000
     5 |   3100
     6 |    500
     1 |   1050

而不是

dpt_id | salary
------ | ------
     5 |   3100
     6 |    500

如果我以CTE的方式写,也是一样的.

with
sum_sal_per_dpt as (select dpt_id, sum(salary) as total_salaries
                    from salaries
                    group by dpt_id)
select sum_sal_per_dpt.dpt_id, max(sum_sal_per_dpt.total_salaries)
from sum_sal_per_dpt
group by sum_sal_per_dpt.dpt_id
union
select sum_sal_per_dpt.dpt_id, min(sum_sal_per_dpt.total_salaries)
from sum_sal_per_dpt
group by sum_sal_per_dpt.dpt_id

有谁能解释一下吗?

推荐答案

以下内容应该会给出您预期的结果:

;with data as
(
select dpt_id, sum(salary) as total_salaries
from salaries
group by dpt_id
)
select dpt_id, total_salaries
from data 
where total_salaries = (select max(total_salaries) from data)
union 
select dpt_id, total_salaries
from data 
where total_salaries = (select min(total_salaries) from data)

请注意,如果您有多个最大值和/或最小值,上面的代码将为您提供多行,您可以根据您想要查看的内容轻松地进行调整.

在您的代码中,您使用了GROUP BY dpt_id,这就是为什么您仍然每dpt_id获得最大值,因此使用union而不是union all可能会造成额外的混淆,这将删除两个表中相同的行.

Sql相关问答推荐

在SQL:2003(PGQ)中,Cypher查询语言、GQL、PGQL和属性图查询的常见子集是什么?'

如何在case语句中使用条件来计算成对变量

解析键-值对,根据值 Select ,并使用SQL创建新列

部分匹配表中元素的MariaDB查询查找结果

如何隐藏聚合JSON数组元素的键

数组列的postgres更新查询

如何从Spark SQL的JSON列中提取动态数量的键值对

如何在Postgres中为单值输入多行?

改进的SQL子字符串提取

如何使用jsonn_populate_record()插入到包含IDENTITY列的表中

在Postgres,什么是;.USSTZ;在';YYYY-MM-DD;T;HH24:MI:SS.USSTZ';?

用另一个表中的特定名称替换 SQL 查询中的 ID.但我的两个表都有多个列

MySQL中的递归查询邻接表深度优先?

删除每个不同日期中未 Select 的最短最长时间

REGEXP_SUBSTR使用方法

超过100名员工的连续行

来自 SQL Server 的树层次 struct 图的 JSON

如何跨行合并以删除 SQL 中的空值?

从 JSON 数组中移除对象

如何在 SQLite 中将列的两个或多个相等的连续值合并为一个?