2014-09-22 53 views
0

我有两个表GROUP BY子句总是“被表达不是一群”

EMPLOYEES(employee_id,first_name,last_name,salary,manager_id,department_id) 
and 
DEPARTMENTS(department_id,department_name,manager_id) 

当我尝试创建一个新表“删除emp_dept”,其中包含

department_id ,department_name, dcount(count of employees in each department), 
dtotal(total salary of employees in each department), 
dmaxsal(maximum salary in a department), dminsal(minimum salary in a department) 

它显示产生错误ORA00979:不是GROUP BY表达式

我在oracle中这样做了

create table emp_dept as(select e.department_id,d.department_name,count(*),sum(salary),max(salary),min(salary) 
from employees e,departments d where e.department_id= d.department_id 
group by e.department_id); 
+2

尝试在您的“group by”子句中添加“d.department_name”。还要考虑使用标准的'join'语法,尽管这不会导致错误。 – sgeddes 2014-09-22 14:35:25

+0

它的工作原理!但为什么我们需要d.department_name? e.department_id足够了吗? – 2014-09-22 14:39:50

回答

0

您在编写查询时似乎有点困惑。

首先,您在表departments的列中使用了别名,但是您没有在表employees的列中使用别名。

select e.department_id,d.department_name,count(*),sum(salary),max(salary),min(salary) 
from employees e,departments d 

其次,您使用的是where条款,但不应该在left join是一个更好的选择?

where e.department_id= d.department_id 

第三,也是最重要的是,你正在做的e.department_idgroup by,而应该是d.department_id,因为在表departmentsemployees之间的父子关系。我不知道你的表是如何设计的,但逻辑上,department_id应该是departments表中的主键,employees表中的外键。这就是为什么,group by e.department_id不正确。

因此,

group by e.department_id 

应该改为,

group by d.department_id 

我想你只需要修改查询以下列方式:

create table emp_dept as 
(select d.department_id,d.department_name,count(e.*), 
sum(e.salary),max(e.salary),min(e.salary) 
from departments d 
left join employees e 
on e.department_id= d.department_id 
group by d.department_id); 

,希望这将解决你的问题。