列出超过avg的部门名称。没有emps在工作
表 emp_demo
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名员工)。
我制作的查询代码:
select *
from emp_demo
group by dname
having count(emp_id) > AVG(count(emp_id))
误差
无法对包含聚合或子查询的表达式执行聚合函数。
发布于 2020-05-04 01:12:29
此错误是由Server不允许聚合函数包含其他聚合函数造成的。
一种方法是尝试在子查询JOIN
中使用CTE。
;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
发布于 2020-05-04 01:09:20
首先,使用变量计算emp_id
的平均数量。这有一个子查询,用于计算每个dname
的计数,然后主查询在此基础上运行一个平均值。
查询的第二部分是一个只提供信息的行,告诉您它计算出的平均值是多少。如果你不想要就不需要了。
第三部分再次运行计数,但筛选出不大于开始时计算的dname
变量的@avg_emps
条目:
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;
发布于 2020-05-04 01:13:30
使用CTE,返回每个部门的平均员工数:
with cte as (
select dname, count(*) counter
from emp_demo
)
select dname
from cte
where counter > (select avg(counter) from cte)
https://stackoverflow.com/questions/61588492
复制