[英]select dept names who have more than 2 employees whose salary is greater than 1000
[英]Select the dept names where the sum of their employees' salaries is greater than the average of all departments'
我們有包含列 empno、ename、job、mgr、hiredate、sal、comm、deptno 的表 emp 和包含列 deptno、dname、loc 的表部門
我們正在選擇員工工資總和大於所有部門的平均工資總和的 dname
我不熟悉在單個查詢中使用多個 SELECT,這是我嘗試的:
SELECT d.dname FROM emp e
JOIN dept d ON e.deptno = d.deptno
GROUP BY d.deptno HAVING SUM(e.sal) >
(SELECT AVG(sal) FROM emp
GROUP BY deptno)
給出第二個選擇返回多行的錯誤,當我試驗時,我沒有找到匹配正確單行的方法
你如何選擇正確的 dnames?
您可以使用avg()over()
窗口函數來獲得部門明智的工資總和的平均值。 然后在 cte 中使用它並只選擇工資總和大於總和的平均值的部門。
架構和惰性語句:
create table emp(empno varchar(100), ename varchar(100), job varchar(100), mgr varchar(100), hiredate date, sal int, comm int, deptno varchar(100));
insert into emp values('e01','Adam',null,null,'01-01-2021',10000,null,'D01');
insert into emp values('e02','Zaid',null,null,'01-01-2021',12000,null,'D01');
insert into emp values('e03','Noor',null,null,'01-01-2021',20000,null,'D02');
insert into emp values('e04','Seth',null,null,'01-01-2021',12000,null,'D03');
create table dept (deptno varchar(100),dname varchar(100));
insert into dept values('D01','HR');
insert into dept values('D02','IT');
insert into dept values('D03','Sales');
詢問:
with cte as
(
SELECT deptno, SUM(sal) AS salary_sum ,avg(sum(sal))over() salary_average
FROM emp
GROUP BY deptno
)
select *
from cte c inner join dept d
on c.deptno=d.deptno
where salary_sum>salary_average
輸出:
部門 | 工資總和 | 平均工資 | 部門 | 名稱 |
---|---|---|---|---|
D01 | 22000 | 18000.000000000000 | D01 | 人力資源 |
D02 | 20000 | 18000.000000000000 | D02 | 它 |
db<> 在這里擺弄
您的子查詢返回每個部門的平均工資而不是工資總和的平均值:
SELECT d.dname FROM emp e
JOIN dept d ON e.deptno = d.deptno
GROUP BY d.deptno HAVING SUM(e.sal) >
(SELECT AVG(s)
FROM (SELECT SUM(sal) AS s
FROM emp
GROUP BY deptno) t
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.