Oracle SQL嵌套语句问题
我目前正在使用包含以下架构的数据库: 以下是我需要执行的任务: 对于任务1,我制定了以下查询(包含avg(薪水)用于测试目的): 给出输出:Oracle SQL嵌套语句问题,sql,oracle,Sql,Oracle,我目前正在使用包含以下架构的数据库: 以下是我需要执行的任务: 对于任务1,我制定了以下查询(包含avg(薪水)用于测试目的): 给出输出: DNAME COUNT(*) AVG(SALARY) ------------------------- ---------- ----------- Hardware 10 63450 Research
DNAME COUNT(*) AVG(SALARY)
------------------------- ---------- -----------
Hardware 10 63450
Research 4 33250
Headquarters 1 55000
Administration 3 31000
Software 8 60000
Sales 14 40821.4286
然而,我无法理解任务二**我需要有相同的值,但是只有男性的数量,但是与前一个查询相同的平均值**。我尝试了以下陈述:
select dname, count(*), avg(salary)
from department, employee
where dno = dnumber and (dno,sex) in (select dno, sex from employee where sex = 'M' )
group by dname having avg(salary)>30000;
这得出了正确的计算值,但得出的是部门男性的平均工资,而不是男性和女性的平均工资。如下所示:
DNAME COUNT(*) AVG(SALARY)
------------------------- ---------- -----------
Hardware 7 65785.7143
Research 3 36000
Headquarters 1 55000
Software 7 57285.7143
Sales 10 42150
请注意,我必须使用嵌套查询,而不是大小写。
希望这是有意义的,任何帮助将不胜感激
谢谢。您可以使用CASE进行男性员工计数 还将显式联接(FROM子句中以逗号分隔的表)转换为隐式联接
select D.dname, count(case when E.sex='M' then 1 else 0), avg(E.salary)
from department D
join employee E
on E.dno = D.dnumber
group by D.dname
having avg(Esalary)>30000;
根据OP注释,如果只需要使用嵌套查询就可以完成,那么可以使用子查询完成
select T.dname, count(*), T.salary as AverageSalary
FROM employee E
join ( select D.dname, D.dnumber, avg(salary) as salary
from employee E
join department D
on E.dno = D.dnumber
group by D.dname, D.dnumber
having avg(salary) > 30000 ) T
on E.sex ='M'
and E.dno = T.dnumber
group by T.dname, T.salary
这也可以通过评估子查询、派生表或每个部门的cte中的总体平均值来完成,然后再将其应用于筛选的员工。还要注意,在
join
而不是where
中加入的首选项
with cteSalary as
(
select dname, dno, avg(salary) as avgSalary
from department inner join employee on dno = dnumber
group by dname, dno
)
select s.dname, count(e.fname), s.avgSalary
from employee e inner join cteSalary s on e.dno = s.dno
where e.sex = 'M' and s.avgSalary > 30000
group by s.dname, s.avgSalary;
另一种解决方案是(未经测试):
一位朋友确实向我展示了这种方法,但根据讲师的说法,我们必须使用嵌套查询。我将在帖子中澄清这一点。我知道这是最好的方式,但不是我们被告知的方式。谢谢,虽然我在第9行收到一个丢失的关键字错误?E.sex='M'?谢谢你的意见。
with cteSalary as
(
select dname, dno, avg(salary) as avgSalary
from department inner join employee on dno = dnumber
group by dname, dno
)
select s.dname, count(e.fname), s.avgSalary
from employee e inner join cteSalary s on e.dno = s.dno
where e.sex = 'M' and s.avgSalary > 30000
group by s.dname, s.avgSalary;
with t as
(select dname, sex,
count(*) over (partition by dno, sex) as count_emp,
avg(salary) over (partition by dno) as avg_salary
from department
join employee on dno = dnumber)
select distinct *
from t
where avg_salary > 30000
and sex = 'M';