Sql 查找超过EMP平均数量的部门

Sql 查找超过EMP平均数量的部门,sql,sql-server,Sql,Sql Server,列出超过EMP平均数量工作的部门名称 表emp_演示 D1中有2名员工,D2中有3名员工,D3中有1名员工 平均员工人数为2+3+1/3=2名员工 因此,这里的员工数超过平均数的部门将是D2,有3名员工 我的查询代码: 错误 无法对包含聚合或子查询的表达式执行聚合函数 首先,使用一个变量计算emp_id的平均数量。这有一个子查询,它计算每个dname的计数,然后主查询在此基础上运行一个平均值 查询的第二部分是一个仅提供信息的行,告诉您它计算出的平均值。如果你不想要,就不需要了 第三部分再次运行计

列出超过EMP平均数量工作的部门名称

表emp_演示

D1中有2名员工,D2中有3名员工,D3中有1名员工

平均员工人数为2+3+1/3=2名员工 因此,这里的员工数超过平均数的部门将是D2,有3名员工

我的查询代码:

错误

无法对包含聚合或子查询的表达式执行聚合函数


首先,使用一个变量计算emp_id的平均数量。这有一个子查询,它计算每个dname的计数,然后主查询在此基础上运行一个平均值

查询的第二部分是一个仅提供信息的行,告诉您它计算出的平均值。如果你不想要,就不需要了

第三部分再次运行计数,但过滤掉不大于开始时计算的@avg_emps变量的dname条目:

declare @avg_emps int = (
    select 
    avg(emp_count) as avg_emp_count
    from (
        select
        dname
        ,count(emp_id) as emp_count
        from dbo.foo
        group by dname
    ) as count_emps
    )

select 'Average employees per department is: ' + cast(@avg_emps as varchar(10));

select
dname
from dbo.foo
group by dname
having count(emp_id) > @avg_emps;

首先,使用一个变量计算emp_id的平均数量。这有一个子查询,它计算每个dname的计数,然后主查询在此基础上运行一个平均值

查询的第二部分是一个仅提供信息的行,告诉您它计算出的平均值。如果你不想要,就不需要了

第三部分再次运行计数,但过滤掉不大于开始时计算的@avg_emps变量的dname条目:

declare @avg_emps int = (
    select 
    avg(emp_count) as avg_emp_count
    from (
        select
        dname
        ,count(emp_id) as emp_count
        from dbo.foo
        group by dname
    ) as count_emps
    )

select 'Average employees per department is: ' + cast(@avg_emps as varchar(10));

select
dname
from dbo.foo
group by dname
having count(emp_id) > @avg_emps;

该错误是由SQL Server不允许聚合函数包含另一个聚合函数引起的

可以尝试将CTE与子查询联接一起使用的一种方法


该错误是由SQL Server不允许聚合函数包含另一个聚合函数引起的

可以尝试将CTE与子查询联接一起使用的一种方法


使用CTE返回每个部门的平均员工人数:

with cte as (
  select dname, count(*) counter
  from emp_demo
)
select dname
from cte
where counter > (select avg(counter) from cte)

使用CTE返回每个部门的平均员工人数:

with cte as (
  select dname, count(*) counter
  from emp_demo
)
select dname
from cte
where counter > (select avg(counter) from cte)

这应在不使用任何变量的情况下工作:

SELECT *
FROM emp_demo
GROUP by dname
HAVING count(emp_id) > (
    SELECT AVG(r1.c1)
    from (
        SELECT count(emp_id)) as c1
        FROM emp_demo
        GROUP by dname
    ) as r1
)

这应在不使用任何变量的情况下工作:

SELECT *
FROM emp_demo
GROUP by dname
HAVING count(emp_id) > (
    SELECT AVG(r1.c1)
    from (
        SELECT count(emp_id)) as c1
        FROM emp_demo
        GROUP by dname
    ) as r1
)

AVGcountemp_id不是有效的sql表达式。回显@forpas时,该问题甚至将此语法描述为与错误一起不起作用!AVGcountemp_id不是有效的sql表达式。回显@forpas时,该问题甚至将此语法描述为与错误一起不起作用!