Oracle 查询以计算不同表中的值

Oracle 查询以计算不同表中的值,oracle,Oracle,从一个由EMP和DEP两个表组成的数据库中,我需要列出所有位置(DEPT.LOC)、此位置有多少部门以及此部门有多少员工(EMP.EMPNO) 创建一个视图,列出所有地点(Loc)以及该地点的部门数量和这些部门雇用的员工数量 我编写了下面的查询,但得到了错误:缺少表达式 SELECT D1.LOC, COUNT(D1.DEPTNO),COUNT(SELECT * FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO AND D.LOC = D1.LOC ) F

从一个由EMP和DEP两个表组成的数据库中,我需要列出所有位置(DEPT.LOC)、此位置有多少部门以及此部门有多少员工(EMP.EMPNO)

创建一个视图,列出所有地点(Loc)以及该地点的部门数量和这些部门雇用的员工数量

我编写了下面的查询,但得到了错误:缺少表达式

SELECT D1.LOC, COUNT(D1.DEPTNO),COUNT(SELECT * FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO AND  D.LOC = D1.LOC ) FROM DEPT D1 GROUP BY D1.LOC

你尝试的方式几乎是正确的(尽管这不是最自然的方式),而且可以挽救

您的内部
select
会为每个部门返回几行<代码>计数(…)适用于单个表达式-它位于列上,但它对单个表达式计数,而不是对多行输入计数

相反,在内部选择中,您应该选择
count(*)
,而不是
*
;然后外部聚合应该是
sum()
。大概是这样的:

SELECT D1.LOC, COUNT(D1.DEPTNO),
       sum((SELECT count(*) FROM EMP E, DEPT D 
            WHERE E.DEPTNO = D.DEPTNO AND  D.LOC = D1.LOC ))
FROM DEPT D1 GROUP BY D1.LOC
还要注意与
sum()
函数一起使用的两组括号。(事实上,这就是您报告的即时错误的原因。)您正在对数字求和,外圆括号是函数调用的一部分。但要求和的数字是“标量子查询”(返回单行和单列的子查询,恰好是可以求和的数值;在本例中,该数值是按部门统计的员工数)。子查询(标量查询或其他查询)也必须始终包含在自己的一组括号中,即使它出现在函数调用或其他类型的括号中

现在:做同样事情的更自然的方法是使用连接;不过,我不确定你的介绍课程是否足够深入,是否已经研究过这个问题

select d.loc, count(distinct d.deptno) as departments, count(e.empno) as employees
from   dept d left outer join emp e on d.deptno = e.deptno
group  by d.loc
;
外部联接是必需的,这样即使部门没有任何员工,也可以(针对每个位置)对其进行计数。事实上,在SCOTT的模式中,有一个没有员工的部门,而它是所在地唯一的部门。如果使用上面的内部联接,该位置甚至不会出现在输出中

注意-家庭作业问题要求您创建一个视图,而不是
SELECT
查询。那部分很琐碎——我想你可以自己做