首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >找到比avg更多的部门。没有emps在运行SQL。

找到比avg更多的部门。没有emps在运行SQL。
EN

Stack Overflow用户
提问于 2020-05-04 08:57:37
回答 4查看 192关注 0票数 0

列出超过avg的部门名称。没有emps在工作

emp_demo

代码语言:javascript
代码运行次数:0
运行
复制
emp_id   dname
1        d1
2        d2
3        d3
4        d2
5        d1
6        d2

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

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

我制作的查询代码:

代码语言:javascript
代码运行次数:0
运行
复制
select *
from emp_demo
group by dname
having count(emp_id) > AVG(count(emp_id)) 

误差

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-04 09:12:29

此错误是由Server不允许聚合函数包含其他聚合函数造成的。

一种方法是尝试在子查询JOIN中使用CTE。

代码语言:javascript
代码运行次数:0
运行
复制
;with cte as (
    SELECT dname,COUNT(emp_id) cnt
    FROM emp_demo
    GROUP BY dname
)
SELECT t1.*
FROM cte t1 
JOIN (SELECT avg(cnt) avgCnt FROM cte) t2
ON t1.cnt > t2.avgCnt 

木琴

票数 1
EN

Stack Overflow用户

发布于 2020-05-04 09:09:20

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2020-05-04 09:13:30

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

代码语言:javascript
代码运行次数:0
运行
复制
with cte as (
  select dname, count(*) counter
  from emp_demo
)
select dname
from cte
where counter > (select avg(counter) from cte)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61588492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档