在Oracle中创建一个显示每个部门平均工资的视图?

时间:2017-10-30 19:33:03

标签: sql database oracle

我希望在Oracle中提供一个能够显示每个部门平均工资的视图。我使用的表格是员工,其中包含 empno 薪水 deptname 字段。

我试图通过这样做来实现:

WHERE

给了我错误:

  

不是单一的群组功能

然后我尝试通过

对它们进行分组
create view v_employee 
as select avg(salary),deptname as average_salary from employee 
order by name;

给了我错误:

  

不是GROUP BY表达式

我可以做些什么来制作这种观点?感谢

1 个答案:

答案 0 :(得分:4)

select avg(salary),deptname as average_salary

您已请求2列,第一列没有标签,您已将重新标记的deptname设为“average_salary”。所以你可能真的想要:

select deptname, avg(salary) as average_salary

为了产生平均值,必须进行一些算术运算,其中考虑了每个部门的所有工资,即我们将数据“分组”为每个部门的一行。

select deptname, avg(salary) as average_salary from employee
group by deptname

对于select子句中的每一列,我们都没有使用像AVG()这样的聚合函数,我们必须在group by子句中使用相同的列。如果不这样做,您将收到有关“不是按表达式分组”的错误消息。

我们可以添加创建视图代码:

create view v_employee as
select deptname, avg(salary) as average_salary from employee
group by deptname

但是,您不应该将order by放入视图中,因为这可能非常低效。当您使用视图是后续查询时,那么包括order by例如

select *
from v_employee
where deptname like 's%'
order by average_salary DESC

在该示例中,视图中的任何嵌入式顺序都将被丢弃,因为我们现在想要的是最高的平均值。另外,因为我们使用了where子句,所以我们只需要订购几行,而不是所有行。