Oracle SQL嵌套语句问题

Oracle SQL嵌套语句问题,sql,oracle,Sql,Oracle,我目前正在使用包含以下架构的数据库: 以下是我需要执行的任务: 对于任务1,我制定了以下查询(包含avg(薪水)用于测试目的): 给出输出: DNAME COUNT(*) AVG(SALARY) ------------------------- ---------- ----------- Hardware 10 63450 Research

我目前正在使用包含以下架构的数据库:

以下是我需要执行的任务:

对于任务1,我制定了以下查询(包含avg(薪水)用于测试目的):

给出输出:

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';