的Oracle SQL跨多个表

的Oracle SQL跨多个表

问题描述:

这里查询平均有关系:的Oracle SQL跨多个表

CREATE TABLE employee (
    name varchar2(15) not null, 
    ssn  char(9), 
    sex  char, 
    salary number(10,2), 
    dno  number(4), 
    primary key (ssn), 
    foreign key (dno) references department(dnumber) 
); 

CREATE TABLE department (
    dname  varchar2(15) not null, 
    dnumber  number(4), 
    primary key (dnumber), 
    unique (dname), 
); 

Q1:对于每个部门,其员工平均薪水超过$ 30,000,检索部门名称和员工的该部门工作的人数。第二季度:假设我们希望每个部门的男性员工人数而不是所有员工(如Q1)来计算部门平均数和员工人数。我们可以在SQL中指定这个查询吗?为什么或者为什么不。

谢谢!

+1

你尝试过什么?看起来你已经发布了你的家庭作业。我们很乐意提供帮助,但您需要向我们展示您迄今为止能够弄清楚的内容。 – 2013-04-10 20:12:10

你的第一个查询可能看起来像

SELECT d.dname, 
     COUNT(*) total_employees 
    FROM department d LEFT JOIN 
     employee e ON d.dnumber = e.dno 
GROUP BY d.dname 
HAVING AVG(e.salary) > 30000; 

,第二个

SELECT d.dname, 
     COUNT(*) male_employees 
    FROM department d LEFT JOIN 
     employee e ON d.dnumber = e.dno 
WHERE e.sex = 'M' 
GROUP BY d.dname 
HAVING AVG(e.salary) > 30000; 

SQLFiddle

+1

你有习惯输入'inner join'。为了一致性和可读性,为什么不输入“left outer join”? – 2013-04-10 20:41:03

+0

@EgorSkriptunoff这与问题/答案有什么关系,它为什么这么打扰你? – peterm 2013-04-10 21:28:23

+0

我还没回家,但我会拉起我的东西,今晚试穿你的。我现在有几个问题。你在计算哪个员工属性?这里有必要的加入吗?我可以在没有他们的情况下加入吗? – maxspiderx 2013-04-10 22:21:36

如果你想获得所有员工的数量和男性的数量员工在一个SQL中,你可以试试这个。

SELECT B.DNAME, 
COUNT(*) AS TOTAL_EMPLOYEES, 
COUNT(CASE WHEN A.SEX='M' THEN A.SEX END) AS MALE_EMPLOYEES, 
AVG(A.SAL) AS ALL_AVG, 
AVG(CASE WHEN A.SEX='M' THEN A.SAL END) AS MALE_AVG 
FROM EMPLOYEE A JOIN DEPARTMENT B 
ON A.DNO=B.DNUMBER 
GROUP BY B.DNAME 
+0

看起来不错。谢谢! – maxspiderx 2013-04-11 03:15:04

SELECT dname, COUNT(*) AS Num_of_Employees  
FROM employee, department  
WHERE dno = dnumber AND EXISTS (
     SELECT AVG(Salary)  
     FROM employee  
     GROUP BY dno  
     HAVING AVG(Salary)>30000)  
GROUP BY dname;  
+0

一些解释会很好。 – Silicomancer 2014-12-09 21:26:23

+0

正如所写,外部查询与内部查询不相关。如果某个部门的平均员工工资超过30,000美元,“EXISTS”将对各部门评估为真。 – Allan 2014-12-09 21:38:00