SQL聚合分组疑问:为何某查询无法正确获取最高收入及人数?
关于SQL分组查询筛选最高总收入的逻辑疑问
需求说明
我们定义员工的总收入为月薪*工作月数,需要编写查询语句获取最高总收入以及达到该收入的员工数量,输出为空格分隔的两个整数。
Employee表结构:
输出示例:69952 1(最高收入为69952,仅Kimberly达到该收入)
正确查询语句
以下查询可以得到正确结果:
Select salary*months, count(name) from employee where salary*months=(Select max(salary*months) from employee) group by salary*months;
存在疑问的查询语句
以下查询无法得到正确结果,返回的是所有不同总收入的分组及其人数,而非仅最高收入的分组:
Select max(salary*months),count(name) from employee group by salary*months;
逻辑差异解释
疑问查询的问题所在
group by salary*months的作用是将所有总收入相同的员工归为一组,比如表中有3种不同的总收入,就会生成3个分组。每个分组执行max(salary*months)时,由于该组内所有员工的总收入完全相同,这个max的结果就是该组的总收入本身;count(name)则是该组的员工数量。最终这个查询会返回所有分组的信息,自然包含了非最高收入的分组,不符合需求。
正确查询的逻辑
- 子查询
(Select max(salary*months) from employee)先计算出整个表的最高总收入,这是一个全局的单一值。 where子句筛选出所有总收入等于这个全局最大值的员工记录,此时剩下的所有记录的总收入都一致。- 最后通过
group by salary*months分组(其实此时所有记录的分组字段值相同,分组后仅一个组),得到最高总收入和对应的员工数量。
额外说明:正确查询中的group by可以省略,因为筛选后的记录总收入都相同,直接执行Select max(salary*months), count(name) from employee where salary*months=(Select max(salary*months) from employee)也能得到相同结果。
内容的提问来源于stack exchange,提问作者newb_92
相关产品推荐
相关产品推荐

