Oracle sql嵌套聚合函数

Oracle sql嵌套聚合函数,sql,database,oracle,Sql,Database,Oracle,在嵌套聚合函数中,使用group by子句exmax(avg(salary))为每个部门计算第一个工资,假设分组是按部门进行的,然后选择最大值。现在我无法理解的是多重聚合函数是如何工作的 select max(dept), max(avg(salary)) from employee group by dept; 这样的查询将如何工作?哪个聚合函数首先执行?有谁能帮我一下吗,我是SQL新手。假设您有这个表: create table employee (dept number(4),

在嵌套聚合函数中,使用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
您的查询显示部门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;

提示1,不要按也用作聚合函数参数的列分组。(部门…)按部门从员工组中选择最高(薪资)、最高(平均(薪资))您的查询毫无意义。每个部门的最高工资是可以的,但是当你说每个部门的最高平均工资时,你期望什么呢?如果你提供样本数据和期望的结果,有人可以帮助你。你怎么可能没有期望的结果?您的查询必须有一些示例输入数据和预期的输出-否则,您将如何知道您的查询是否按预期运行?