sql - Oracle sql 嵌套聚合函数

标签 sql database oracle

在使用 group by 子句 ex max(avg (salary)) 的嵌套聚合函数中,假设分组是按部门完成的,则计算每个部门的第一个工资,然后选择其中的最大值。现在我不明白的是多个聚合函数是如何工作的

 select max(dept), max(avg(salary))
 from employee
 group by dept; 

这样的查询如何工作?哪个聚合函数首先执行?任何人都可以帮助我吗,我是 SQL 新手。

最佳答案

假设您有这张表:

create table employee (dept number(4), salary number(12));
insert into employee values (10, 1000);
insert into employee values (10, 5000);
insert into employee values (20, 2500);
insert into employee values (20, 3500);
insert into employee values (30, 2000);

所以各部门的平均工资是:

select dept, avg(salary) avs from employee group by dept order by dept;
DEPT        AVS
----- ----------
   10       3000
   20       3000
   30       2000

您的查询显示了department_id的最大值(30)和每个部门平均工资的最大值。这些值不相关。 换句话说,您的 SQL 显示了先前输出的最大值。

select max(dept), max(avg(salary)) from employee group by dept;
DEPT        AVS
----- ----------
   30       3000

如果您想显示平均工资最高的部门,您有多种选择。
如果有多个这样的部门,一切都取决于您想要做什么,就像在我的示例中,其中两个(10 和 20)具有相等的最高平均值:

-- use HAVING clause with subquery (old school):
select dept, avg(salary) avs
  from employee group by dept
  having avg(salary) = (select max(avg(salary)) from employee group by dept)
  order by dept;

-- use analytic MAX() function:
select dept, avs
  from (
    select dept, avg(salary) avs, max(avg(salary)) over () max_avs
      from employee group by dept)
  where avs = max_avs order by dept;

-- use analytic DENSE_RANK():
select dept, avs 
  from (
    select dense_rank() over (order by avg(salary) desc) rnk, dept, avg(salary) avs 
      from employee group by dept)
  where rnk = 1 order by dept;

-- if you want ONLY ONE ROW use MIN(...) or MAX(...) KEEP (DENSE_RANK...)
-- this returns department with lower ID:
select min(dept) keep (dense_rank last order by avg(salary)) dept,
       min(avg(salary)) keep (dense_rank first order by avg(salary) desc) avs
  from employee group by dept;

-- this returns department with higher ID:
select max(dept) keep (dense_rank last order by avg(salary)) dept,
       max(avg(salary)) keep (dense_rank first order by avg(salary) desc) avs
  from employee group by dept;

SQLFiddle demo

关于sql - Oracle sql 嵌套聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33628242/

相关文章:

mysql - Django 使用外部 mysql DB - 解决问题的最佳方法

java - 为什么在传递 String 参数时得到不正确的结果集?

sql - 创建唯一的主键以忽略重复项

sql - 在 PostgreSQL 12 上按 id(唯一)分组的一个查询中同时获取房间成员、房间所有者和管理员

database - MongoDB 在用户家庭地址上嵌入 vs 引用?

mysql - 查询具有一个值的两个组合字段

xml - 数据库 XPath 查询

c# - DataTable load() 约束错误

mysql - mysql 上没有主键的弱实体

sql - T SQL 条件字符串连接